Javascript toFixed 不四舍五入

IT技术 javascript
2021-02-06 06:12:02

我正在使用 javascript 绑定到一些复选框,并且toFixed(2)没有四舍五入。任何想法为什么它不四舍五入?例如,如果数字是859.385它只显示859.38而不是859.39

我还读到,toFixed根据您使用的浏览器可以以不同方式舍入,有人知道解决这个问题的方法,以便我的 javascript 计算与我的 php 计算相匹配?

var standardprice = parseFloat($('#hsprice_'+this.id.split('_')[1]).val());
var price =  parseFloat($('#hprice_'+this.id.split('_')[1]).val());
var discount =  parseFloat($('#hdiscount_'+this.id.split('_')[1]).val());
var deposit =  parseFloat($('#hdeposit_'+this.id.split('_')[1]).val());

var currSprice = parseFloat($('#hTotalSprice').val());
var currPrice = parseFloat($('#hTotalPrice').val());
var currDiscount = parseFloat($('#hTotalDiscount').val());
var currDeposit = parseFloat($('#hTotalDeposit').val());

currSprice += standardprice;
currPrice += price;
currDiscount += discount;
currDeposit += deposit;

$('#lblTotalSprice').text('$'+addCommas(currSprice.toFixed(2)));
$('#lblTotalPrice').text('$'+addCommas(currPrice.toFixed(2)));
$('#lblTotalDiscount').text('$'+addCommas(currDiscount.toFixed(2)));
$('#lblTotalDeposit').text('$'+addCommas(currDeposit.toFixed(2)));

$('#hTotalSprice').val(currSprice.toFixed(2));
$('#hTotalPrice').val(currPrice.toFixed(2));
$('#hTotalDiscount').val(currDiscount.toFixed(2));
$('#hTotalDeposit').val(currDeposit.toFixed(2));
6个回答

我还没有找到一个 toFixed10 做错的数字。其他人可以吗?

感谢blg他的回答,让我看到了 Mozilla 的toFixed10()方法。

使用它我想出了这个短的一个班轮,它确实涵盖了这里提到的所有情况......

function toFixed( num, precision ) {
    return (+(Math.round(+(num + 'e' + precision)) + 'e' + -precision)).toFixed(precision);
}
不,这仍然不精确,toFixed(89.684449, 2)应该是89.69,但是是89.68
2021-03-24 06:12:02
@mrts toFixed(89.684449, 2) 是正确的 89.68,如果是 89.685<任何其他不相关的数字>,它只会是 69
2021-03-24 06:12:02
toFixed10 是什么/在哪里?请添加链接?
2021-03-27 06:12:02
toFixed(0.000000015, 8)得到 NaN。对于正确答案 0.00000002 我使用这个函数function round(v,d){return parseFloat(Math.round(v.toFixed(d+1)+'e'+d)+'e-'+d)};
2021-04-05 06:12:02
数字 0.0000001 或更少导致 NaN
2021-04-07 06:12:02

我将此作为最佳舍入函数用于所有财务数据。您可以在所有有问题的数字上对其进行测试。Javascript 允许某种精度,所以我用它来使几乎每个数字都按预期四舍五入。

function roundTo(n, digits) {
        if (digits === undefined) {
            digits = 0;
        }

        var multiplicator = Math.pow(10, digits);
        n = parseFloat((n * multiplicator).toFixed(11));
        return Math.round(n) / multiplicator;
    }
嗯,评论具有误导性,roundTo(89.684449, 2) 不应该是 89.69,而是合法的 89.68。
2021-03-19 06:12:02

在 Chrome 中,toFixed()四舍五入:

859.385 ==> 859.38
859.386 ==> 859.39

当我查看ECMAScript 第 5 版规范.toFixed()(第 15.7.4.5 节)时,我没有看到它明确描述了舍入,尽管它确实描述了一些相当迟钝的东西,这可能是 Chrome 已经实现的。

在我看来,如果您想通过显式舍入来控制它,那么您可能应该使用经常建议的解决方法:

var roundedNum = (Math.round( num * 100 ) / 100).toFixed(2);

这将保证您像以往一样获得可预测的舍入。

这里的工作演示:http : //jsfiddle.net/jfriend00/kvpgE/

@mattbilson 这是标准的 IEEE 浮点数,并不意味着 JavaScript 在这方面不值得信赖。浮点数不是实数(数学意义上),而是完全可以预测的。
2021-03-12 06:12:02
通常会保证您获得可预测的舍入。但是,正如在这个答案中提到的那样,javascript 处理小数的方式不能被真正信任。在 Chrome 控制台中尝试 35.855*100 ......我知道,我也很震惊!这将意味着 (Math.round( 35.855 * 100 ) / 100).toFixed(2) == 35.85 而不是 35.86。请参阅其他答案以获取提示...
2021-03-28 06:12:02

由于在 javascripts 的 toFixed 函数中,浮点数5不属于整数的上半部分,因此如果您有以下数字,则给定的数字会四舍五入:

859.385.toFixed(2) // results in 859.38

事实上,您可能会像这样附加尾随浮点数(零除外):

859.3851.toFixed(2) // results in 859.39

因此,开发人员倾向于添加数字0.00000000001,以便对其进行适当的四舍五入,并且不会意外更改数字的值。

所以我想出了一个函数,它根据你想要固定浮点数的位数来添加这样一个数字:

    // both parameters can be string or number
    function toFixed(number, decimals) {
        var x = Math.pow(10, Number(decimals) + 1);
        return (Number(number) + (1 / x)).toFixed(decimals)
    }
    toFixed(859.385, 2) //results in 859.39
通常我们知道我们想要四舍五入的精度。假设我们想要 num.toFixed(2)。然后将 .0001 添加到 num 从 toFixed 得到正确答案。虽然通用函数很好,但在我看来有点矫枉过正,除非所需数字的数量是一个变量——一种不太可能的情况。
2021-03-14 06:12:02
我能找到的最佳答案!易于阅读的代码,它甚至可以处理双舍入!
2021-03-17 06:12:02
toFixed(.004, 2); == .00 ... 不是 .01
2021-03-19 06:12:02
toFixed(859.3844, 2)859.39,但应该是859.38
2021-04-06 06:12:02

与 35.855 一起尝试的另一个好数字是 1.005

我不认为 Robert Messerle 的解决方案处理 1.005

这里的舍入小数示例https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round $revision/1383484#Decimal_rounding 将数字转换为指数表示法,似乎得到更好的结果。

我在这里创建了一个小提琴http://jsfiddle.net/cCX5y/2/,它演示了上面的本地 Robert Messerle 示例(称为toFixedB)和来自 Mozilla 文档的示例(称为toFixed10)。

我还没有找到一个 toFixed10 做错的数字。其他人可以吗?

看起来这个答案也有效并且不涉及所有额外的代码。
2021-03-12 06:12:02
所有这些都是不精确的,toFixed10(89.684449, 2)其他的应该是89.69,但是是89.68
2021-03-21 06:12:02
我认为你是双四舍五入。en.wikipedia.org/wiki/Rounding#Double_rounding)。任何数字(例如 1.2345)将四舍五入为 1.23 而不是 1.24
2021-03-21 06:12:02
很好的小提琴和链接。我添加了 user2823670 的单行:jsfiddle.net/cCX5y/3
2021-03-22 06:12:02