乘以&圆形JavaScript问题

时间:2016-06-24 13:50:19

标签: javascript

我正在为我们公司编写一个简单的发票解决方案,并且必须将quantity * rate乘以并将结果四舍五入到小数点后两位。

Quantity: 36.5
Rate: 33.33

我的乘法如下:

console.log((36.5 * 33.33).toFixed(2))

返回

1216.54

什么时候应该

1216.55

我认为这是因为JavaScript正在向下而不是向上。知道如何解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

功能按ES standart中所述的方式工作。它不会向下舍入(并非总是如此)。

我在标准中跳过了前7个算法步骤(在这种情况下它们并不重要)。

变量定义:

f - is number of digits required after dot
x - is number (in our case 1216.5449999)

在括号中,我描述了会发生什么以及为什么会这样。

  1. 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")
    
  2. return m;

  3. 如果您仍然担心应用中的右侧四舍五入。那么你可能应该编写自己的舍入方法(也可以尝试搜索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()
    }