【问题标题】:c++, static_cast <int> of float point calculation and possible of losing integersc++, static_cast <int> 的浮点计算和可能丢失整数
【发布时间】:2015-02-19 06:51:47
【问题描述】:

使用以下代码:

    int ten{ 1 };
    double zeroPnine{ 0.9 };

    cout << ten - zeroPnine << endl; // 0.1
    cout << (ten - zeroPnine) * 10 << endl; // 1
    cout << static_cast <int>(ten - zeroPnine) << endl; // 0    
    cout << static_cast <int>((ten - zeroPnine) * 10 )<< endl; // 1

我期待最后一行输出1,但实际输出实际上是0,怎么会?

完整输出: 0.1
1
0
0

【问题讨论】:

  • 由于计算机上浮点格式的不精确性,会导致舍入误差。
  • 如果你在没有静态转换的情况下打印出最后一行,它会显示 1,或者至少接近 1。但是如果你说 "((ten - zeroPnine) * 10) == 1" ,因为 Joachim 所说的原因,它说的是假的。值不精确。浮点数应该依赖于相对值,而不是离散点。
  • 0.9 不是整数。
  • 我知道 0.9 不是整数,但是 1 - 0.9 = 0.1,而 0.1 * 10 应该给我 1,为什么会有问题?
  • 由于浮点数的工作方式,0.9 实际上是0.90000000000000002220446049250313080847263336181640625

标签: c++ c++11 visual-c++ static-cast


【解决方案1】:

最好的建议是避免使用 static_cast 来转换双精度。

如果您希望答案是整数,请在进行计算之前尝试将 double 转换为 int。

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2010-12-10
    • 2022-12-31
    相关资源
    最近更新 更多