Tôi đã gõ này vào vỏ python:hành vi kỳ lạ với phao nổi và chuyển đổi chuỗi
>>> 0.1*0.1
0.010000000000000002
tôi mong đợi rằng 0,1 * 0,1 không phải là 0,01, vì tôi biết rằng 0,1 trong cơ sở 10 là kỳ tại cơ sở 2.
>>> len(str(0.1*0.1))
4
Tôi dự kiến nhận được 20 như tôi đã thấy 20 ký tự ở trên. Tại sao tôi nhận được 4?
>>> str(0.1*0.1)
'0.01'
Ok, điều này giải thích tại sao tôi len
mang lại cho tôi 4, nhưng tại sao str
trở '0.01'
?
>>> repr(0.1*0.1)
'0.010000000000000002'
Tại sao str
tròn nhưng repr
không? (Tôi đã đọc this answer, nhưng tôi muốn biết làm thế nào họ đã quyết định khi str
tròn một phao và khi nó không)
>>> str(0.01) == str(0.0100000000001)
False
>>> str(0.01) == str(0.01000000000001)
True
Vì vậy, nó có vẻ là một vấn đề với tính chính xác của phao nổi. Tôi nghĩ rằng Python sẽ sử dụng IEEE 754 nổi precicion đơn. Vì vậy, tôi đã kiểm tra nó như thế này:
#include <stdint.h>
#include <stdio.h> // printf
union myUnion {
uint32_t i; // unsigned integer 32-bit type (on every machine)
float f; // a type you want to play with
};
int main() {
union myUnion testVar;
testVar.f = 0.01000000000001f;
printf("%f\n", testVar.f);
testVar.f = 0.01000000000000002f;
printf("%f\n", testVar.f);
testVar.f = 0.01f*0.01f;
printf("%f\n", testVar.f);
}
tôi nhận:
0.010000
0.010000
0.000100
Python mang lại cho tôi:
>>> 0.01000000000001
0.010000000000009999
>>> 0.01000000000000002
0.010000000000000019
>>> 0.01*0.01
0.0001
Tại sao Python cho tôi những kết quả này?
(. Tôi sử dụng Python 2.6.5 Nếu bạn biết về sự khác biệt trong phiên bản Python, tôi cũng sẽ quan tâm đến họ.)
không chắc chắn lý do người dùng xóa câu trả lời của họ, nhưng thực sự hành vi được giải thích trong [hướng dẫn] (http://docs.python.org/2/tutorial/floatingpoint.html) – SilentGhost
'float ('4.1') * 100 == 409.99999999999994' – Hugo