当前位置:  开发笔记 > 编程语言 > 正文

C++ int64*double == off by one

如何解决《C++int64*double==offbyone》经验,为你挑选了1个好方法。

下面是我在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> roeland..:

1.18,或118/100不能用二进制精确表示,它会有重复的小数.如果你用十进制写1/3,也会发生同样的情况.

所以让我们用十进制的类似情况,让我们计算(1/3)×30000,当然应该是10000:

赔率= 1/3st = 30000

由于计算机的精度有限,我们必须将此数字截断为有限的小数位数,假设为6,所以:

赔率= 0.333333

0.333333×10000 = 9999.99.演员(在您的程序中隐式)会将此数字截断为9999.

没有100%可靠的解决方法.floatdouble只是还只有有限的精度.处理这个是一个难题.

您的程序包含从行double到整数的隐式强制转换int64_t res = st * odds;.许多编译器会警告你这件事.它可能是您描述的类型的错误的来源.此演员表可以明确地写为(int64_t) some_double,将数字四舍五入为零.

另一种方法是使用舍入到最接近的整数round(some_double);.在这种情况下,这将给出预期的结果.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有