【问题标题】:Rounding a double number up to the tenths place [duplicate]将双数四舍五入到十分位 [重复]
【发布时间】:2011-10-23 23:22:32
【问题描述】:

可能重复:
round() for float in C++

好吧,假设我有号码 8.47434。我想将它四舍五入到 8.5 和小数点后 1 位。我将如何在 C++ 中执行此操作

【问题讨论】:

  • 对于快速而肮脏的解决方案,您可能需要专门阅读this answer

标签: c++ double rounding


【解决方案1】:

乘以10,四舍五入再除以10

例子:

round(10 * 8.47434f) / 10;

编辑:

好的,我刚刚发现round() 并不总是出现在math.h 中。

以上内容适用于 gcc 和 icl(使用 Microsoft 的库),但不适用于 tcc。

floor() 然而,是标准库的一部分。所以要四舍五入,我们可以添加0.5并使用floor()

例子:

floor(10 * 8.47434f + 0.5f) / 10;

【讨论】:

  • 缺少几度细微差别,IMO
  • 你可能,实际上肯定乘以 10 会损失精度,并且边缘情况会以错误的方式舍入
【解决方案2】:

std::floor(d)+std::floor((d-std::floor(d))*10.0+0.5)/10.0

这样做不会失去精度,而不是其他将原始双倍乘以 10 的答案。(顺便说一下,d 将是您的数字)

但请注意:浮点数不能代表任何东西。使用双打:1.35 将四舍五入为1.3999999999999999123.34 首先将表示为123.34999999999999,导致它向下舍入为123.3,而不是预期的123.4;等等

【讨论】:

  • 你的例子好像错了,我认为你最近的编辑改错了5->4
【解决方案3】:

您可以乘以 10 将 0.5 强制转换为 int 并除以 10。

如果数字为负数,则减去 0.5 或乘以除以负十。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2014-05-09
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多