我正在为我们公司编写一个简单的发票解决方案,并且必须将quantity * rate
乘以并将结果四舍五入到小数点后两位。
Quantity: 36.5
Rate: 33.33
我的乘法如下:
console.log((36.5 * 33.33).toFixed(2))
返回
1216.54
什么时候应该
1216.55
我认为这是因为JavaScript正在向下而不是向上。知道如何解决这个问题吗?
谢谢!
答案 0 :(得分:0)
功能按ES standart中所述的方式工作。它不会向下舍入(并非总是如此)。
我在标准中跳过了前7个算法步骤(在这种情况下它们并不重要)。
变量定义:
f - is number of digits required after dot
x - is number (in our case 1216.5449999)
在括号中,我描述了会发生什么以及为什么会这样。
x低于10 ^ 21所以
a)令n为整数,其精确数学值n÷10 ^ f - x尽可能接近零。 (n会 是121654)
(差异将为-0.4999999,权利四舍五入(121655)差异将为(0.50000000))。
b)设m是由n的十进制表示的数字组成的字符串(m是“121654”)
c)f!= 0为真,所以
i) Let k be the number of characters in m.(k = 6)
ii) if k < f (not out case skipping it)
iii) Let a be the first k–f characters of m (a = "1216"), and let b be the remaining f characters of m (m = "54")
iv) Let m = a + "." + b. (m = "1216.54")
return m;
如果您仍然担心应用中的右侧四舍五入。那么你可能应该编写自己的舍入方法(也可以尝试搜索npm库。我不知道它们是否存在)。
编辑:
具有右舍入的函数(它很慢但是做法):
function myToFixed( val, digits_num ){
if( ! digits_num ) digits_num = 0
var tmp = val.toString().split('.')
var decimal = tmp[1]
var full = tmp[0];
var regex = /[5-9]/
var match = regex.exec( decimal.slice( digits_num ) )
if( ! match ){ return val.toFixed( digits_num ) }
var i = match.index + digits_num
while( i >= digits_num ){ val = ( parseFloat( val ).toFixed( i ) ); i-- }
return val.toString()
}