下面是我在64位环境和32位环境中测试过的代码.结果每次恰好都是一个.预期的结果是:1180000000,实际结果是1179999999.我不确定为什么,我希望有人可以教育我:
#include#include using namespace std; int main() { double odds = 1.18; int64_t st = 1000000000; int64_t res = st * odds; cout << "result: " << res << endl; return 1; }
我感谢任何反馈.
1.18,或118/100不能用二进制精确表示,它会有重复的小数.如果你用十进制写1/3,也会发生同样的情况.
所以让我们用十进制的类似情况,让我们计算(1/3)×30000,当然应该是10000:
赔率= 1/3且st = 30000
由于计算机的精度有限,我们必须将此数字截断为有限的小数位数,假设为6,所以:
赔率= 0.333333
0.333333×10000 = 9999.99.演员(在您的程序中隐式)会将此数字截断为9999.
没有100%可靠的解决方法.float
而double
只是还只有有限的精度.处理这个是一个难题.
您的程序包含从行double
到整数的隐式强制转换int64_t res = st * odds;
.许多编译器会警告你这件事.它可能是您描述的类型的错误的来源.此演员表可以明确地写为(int64_t) some_double
,将数字四舍五入为零.
另一种方法是使用舍入到最接近的整数round(some_double);
.在这种情况下,这将给出预期的结果.