如何舍入微量?
How to round micros?
在 JavaScript、Python 以及可能的其他语言中,如果将值 37.305
舍入到小数点后两位,则会得到错误的值:
Number(37.305).toFixed(2) => 37.30 // Should be 37.31
表示金钱时解决精度问题的一种方法是使用 micros。也就是说,1.00 美元 => 1,000,000 微米。
我的问题是:如何将代表 $37.305 的值四舍五入到小数点后两位(结果应为 37.31
?
将表示(以微为单位)R四舍五入到n个小数位(在表示值中):
- 设m为106−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。为了支持负数,可能需要对 select 余数进行调整并将舍入规则应用于 select s。这些相当简单,但取决于所使用的编程语言中哪些残数或余数运算方便以及所需的舍入规则。
在 JavaScript、Python 以及可能的其他语言中,如果将值 37.305
舍入到小数点后两位,则会得到错误的值:
Number(37.305).toFixed(2) => 37.30 // Should be 37.31
表示金钱时解决精度问题的一种方法是使用 micros。也就是说,1.00 美元 => 1,000,000 微米。
我的问题是:如何将代表 $37.305 的值四舍五入到小数点后两位(结果应为 37.31
?
将表示(以微为单位)R四舍五入到n个小数位(在表示值中):
- 设m为106−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。为了支持负数,可能需要对 select 余数进行调整并将舍入规则应用于 select s。这些相当简单,但取决于所使用的编程语言中哪些残数或余数运算方便以及所需的舍入规则。