将int与float相乘会导致使用g ++ / visual studio
的值不正确使用double而不是float时,它总能正常工作。
计算也很简单 - 1000 * 0.01 - 应该是10 - 但是它的9。
示例程序
#include <iostream>
#include <stdio.h>
typedef unsigned long long int64;
typedef unsigned int int32;
int main()
{
int64 test = 1000 * 0.01f;
printf("Test %u\n",test); // Prints 10
int64 test2 = 1000;
test2 = test2 * 0.01f;
printf("Test2 %u\n",test2); // Prints 9
int32 test3 = 1000;
test3 = test3 * 0.01f;
printf("Test3 %i\n",test3); // Prints 9
int64 test4 = 1000;
test4 = test4 * 0.01;
printf("Test4 %u\n",test4); // Prints 10
int32 test5 = 1000;
test5 = test5 * 0.01;
printf("Test5 %i\n",test5); // Prints 10
}
输出
Test 10
Test2 9
Test3 9
Test4 10
Test5 10
使用g ++ main.cpp -o main
在Wheezy 32bit上编译 编辑:这只是过于简单了!!!基本上我不使用0.01f
我所做的是将一个单位转换为另一个单位,例如我的一个单位是1:100到另一个单位。另一个是1:10或1:1000。
所以我基本上计算unit1 / unit2以获得正确的乘数,如果我想总和2个不同的单位。
在这种情况下,它是unit1 = 1000 unit2 = 10
所以10/1000 = 0.01 * 1000 = 10
因此,当我想将1000个unit1转换为unit2时,它应该导致10,因为基本上unit1是1000的base,而unit2是10 base。
答案 0 :(得分:2)
欢迎来到浮点数的世界。这里发生的是0.01f
是二进制的重复小数,因此1000 * 0.01f
等于9.99999999...
到我无法记住的一定数量的地方。之后,存在整数截断,因此9.9999... = 9.
为什么0.01f
是重复的小数?这是浮点的解剖。 http://www.johndcook.com/blog/2009/04/06/anatomy-of-a-floating-point-number/
有关该主题的更多信息,Computerphile有一个有趣的视频。