如何舍入微米?

时间:2018-10-31 01:34:28

标签: floating-point precision currency floating-accuracy

在JavaScript,Python和可能的其他语言中,如果将值37.305舍入到小数点后两位,则会得到错误的值:

Number(37.305).toFixed(2) => 37.30 // Should be 37.31

代表钱时精度问题的一种解决方案是使用micros。即$ 1.00 => 1,000,000微米。

我的问题是:如何将代表$ 37.305的值以微妙(37305000的形式四舍五入到小数点后两位(结果应为37.31

1 个答案:

答案 0 :(得分:1)

将表示形式(以微米为单位) R 舍入为 n 小数位(在表示的值中):

  • m 为10 6- n 。这将为我们提供四舍五入为 n 个小数位的位置值。
  • r R 取模 m 的残基。例如,将37305000微米四舍五入到小数点后两位时, m 是10000,而 r 是5000。
  • 根据所需的舍入规则(在问题中未说明),让 s 为0或 m 。例如,对于最近舍入,如果 r < m / 2,则将 s 设为0(向下舍入)。如果 r > m / 2,则将 s 设为 m (向上舍入)。如果 r = m / 2,则使用所需的规则打破平局。这可能是向上舍入,向下舍入或舍入,具体取决于 m 的下一个较高位。例如,如果规则是将关系四舍五入为偶数,请检查被截断为整数的 R / m 的最后一位。如果是偶数,则将 s 设置为0。如果是奇数,则将 s 设置为 m
  • 所需的舍入结果为 R - r + s

以上满足非负 R 的要求。为了支持负数,可能需要进行调整以选择残基并应用舍入规则选择 s 。这些相当简单,但是取决于使用的编程语言中哪些余数或余数运算方便,以及所需的舍入规则。