【问题标题】:Increment last digit of double value [closed]增加双精度值的最后一位[关闭]
【发布时间】:2013-06-03 13:05:30
【问题描述】:

我有一个类似于 80.14666666666668 的双变量,然后我使用 floor 函数将其截断为 8 位数字,例如 80.14666666。现在我想增加这个值并得到答案 80.14666667

【问题讨论】:

  • 你为什么不直接圆呢?
  • 你为什么不问问题? :)
  • 我会建议“添加 0.00000001”,但我担心反对票...
  • "现在我想增加这个值并得到 80.14666667 的答案。" 我们允许您继续。
  • 如果最后一位是 9 怎么办?

标签: java


【解决方案1】:

您可能不知道doubles 的真实性质。他们没有“数字”;它们是有理数的紧凑二进制编码。因此,您会发现很难以编程方式确定double 的“最后一位”是什么。

如果您的特定需求只是四舍五入,则使用round 函数而不是truncate;否则考虑使用BigDecimal,它真正代表一个带十进制数字的数字。

【讨论】:

    【解决方案2】:

    一种快速的方法是:

    double myNumber = 80.14666666;
    myNumber += (1 / 10^8); // = 80.14666667
    

    这就是你要找的吗?

    【讨论】:

      【解决方案3】:

      双精度实际上并不包含您想象的确切值。这是因为底层字段被保存为二进制数,由于 1/5 的因素,不能包含十分之一。

      相反,您可以使用 new BigDecimal("80.14666666") 并将其增加 new BigDecimal("0.00000001")。

      请注意,我正在传递一个字符串来初始化此对象。如果您传递一个双精度值,BigDecimal 将根据双精度值的值进行初始化,如上所述,它不包含您想象的确切值。

      【讨论】:

        【解决方案4】:

        只需在数字上加上 0.00000001。

        但是,浮点值不太适合这样的计数。每次增加它时,都会增加一个差异,因为这样的数字只能用浮点数近似表示。

        如果要增加数字,请改用整数。将数字乘以 100000000 并将其转换为整数,得到 8014666666。现在您可以将整数加 1,而不会引入任何错误。保持整数递增,根据需要除以 100000000 转换成浮点格式。浮点值当然还是有精度限制的,但是每一个都是整数对应的转换结果,整数值没有任何精度问题,因此每次递增时不会累积错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多