提问人:Hinko Pih Pih 提问时间:7/14/2019 最后编辑:Hinko Pih Pih 更新时间:7/14/2019 访问量:600
我试图将浮点数四舍五入到小数点后两位,但这是不正确的。如何修复 C++ 中的这个舍入错误?
I'm trying to round a float to two decimal points but it's incorrect. How to fix this rounding error in C++?
问:
我在四舍五入浮点数时遇到了问题。我正在解决一项任务,您需要将结果四舍五入到小数点后两位。但是当小数点后第三个点是 5 时,我不能这样做,因为它存储不正确。
例如:我的结果等于 1.005,应该四舍五入为 1.01。但是 C++ 将其舍入为 1.00,因为原始浮点数存储为 1.0049999...而不是 1.005。
我已经尝试过总是在结果中添加一个非常小的浮点数,但还有一些其他测试用例,然后四舍五入,但应该四舍五入。
我知道浮点是如何工作的,而且它通常并不完全准确。我只是想知道是否有人找到了解决这个特定问题的方法。
答:
如果您可以使用像 boost 这样的库及其多精度支持。
另一种选择是使用 ,也许这对你来说已经足够精确了。long double
评论
当你说“我的结果等于 1.005”时,你假设有一些真正的十进制数字。这可以是 1.005(小数部分的三位数字)、1.0050(四位数字)、1.005000 等。
因此,您应该首先使用一些通常的四舍五入到该位数。在整数中执行此操作更简单:例如,对于 6 个小数,表示乘以 1,000,000 后的一些常用 、 等。通过此步骤,您将获得确切的十进制数。在此之后,您可以根据需要进行所需的最终四舍五入。round()
rint()
在您的示例中,这将舍入 1,004,999.99...到1,005,000。然后,除以 10000 并再次四舍五入。
(请注意,有一些建议以特定的方式进行此舍入。通用十进制算术规范和 IBM 算术手册建议,这种舍入方式是精确小数部分 0.5 应从零四舍五入,除非最低有效结果位变为 0 或 5,在这种情况下,它向零四舍五入。但是,如果您没有这样的舍入可用,则一般的远离零也是合适的。
如果要为货币会计实现算术,则完全避免浮点并使用定点运算(如果需要,使用整数模拟)是合理的。这更好,因为我描述的舍入方法不可避免地包含到整数(和返回)的转换,因此,直接使用此类整数更便宜。您还将获得不精确的操作检查(按显式整数溢出的成本计算)。
评论