Javascript toFixed不舍入

use*_*854 53 javascript

我正在使用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));
Run Code Online (Sandbox Code Playgroud)

use*_*670 29

我还没有找到toFixed10错误的数字.还有其他人吗?

感谢blg他的回答,它指向了Mozilla的toFixed10()方法.

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

function toFixed( num, precision ) {
    return (+(Math.round(+(num + 'e' + precision)) + 'e' + -precision)).toFixed(precision);
}
Run Code Online (Sandbox Code Playgroud)

  • @mrts toFixed(89.684449,2)是正确的89.68,如果它是89.685 <任何其他不相关的数字>它将只有69 (8认同)
  • 数字0.0000001或更少会导致NaN (7认同)
  • toFixed10是什么?请添加链接吗? (2认同)
  • 不,这仍然不够精确,`toFixed(89.684449,2)`应该是`89.69`,但是应该是`89.68`。 (2认同)
  • 这不处理双舍入。这是答案作品 /sf/answers/3079877881/ (2认同)
  • 在`toFixed(0.000000015,8)`上获得NaN。要获得正确答案0.00000002,请使用此函数`function round(v,d){return parseFloat(Math.round(v.toFixed(d + 1)+'e'+ d)+'e-'+ d)};`` (2认同)

Shu*_*ura 19

我将其用作所有财务数据中的最佳舍入函数.您可以在所有有问题的数字上进行测试.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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 嗯评论是误导性的,roundTo(89.684449,2)不应该是89.69,合法地是89.68. (15认同)

jfr*_*d00 16

在Chrome中,toFixed()轮次:

859.385 ==> 859.38
859.386 ==> 859.39
Run Code Online (Sandbox Code Playgroud)

当我查看ECMAScript第5版规范.toFixed()(第15.7.4.5节)时,我没有看到它明确地描述了舍入,尽管它确实描述了一些可能是Chrome已实现的内容.

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

var roundedNum = (Math.round( num * 100 ) / 100).toFixed(2);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它通常**保证您可以获得可预测的舍入.但是,如[回答](http://stackoverflow.com/questions/7406494/javascript-multiplying-incorrectly-causing-incorrect-rounding)所述,javascript处理小数的方式实际上并不可信.只需在Chrome控制台中尝试35.855*100 ......我知道,我也很震惊!这意味着`(Math.round(35.855*100)/ 100).toFixed(2)== 35.85`而不是35.86.看到其他答案的提示...... (11认同)
  • @mattbilson 这是标准 IEEE 浮点,并不意味着 JavaScript 在这方面不值得信任。浮点数不是实数(数学意义上的),但完全可以预测。 (4认同)

the*_*oth 9

与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 docs(称为toFixed10)的示例.

我还没有找到toFixed10错误的数字.还有其他人吗?

  • 我认为你是双舍入.(https://en.wikipedia.org/wiki/Rounding#Double_rounding).任何数字,如1.2345将舍入到1.23而不是1.24 (5认同)
  • 好的小提琴和链接。我添加了 user2823670 的一句话:http://jsfiddle.net/cCX5y/3/ (2认同)

Ins*_*sOp 8

由于在javascript的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
Run Code Online (Sandbox Code Playgroud)

  • `toFixed(859.3844, 2)` 给出了 `859.39`,但应该是 `859.38` (4认同)
  • 我能找到的最佳答案!易于阅读的代码,甚至可以处理双舍入! (3认同)

Wii*_*imm 8

toFixed()工作正常!问题是,859.385 在计算机上没有表示为浮点数。它被扫描为最接近的可能值 = 859.384999999999991。将此值四舍五入为 2 位数是 859.38 而不是 859.39。

这就是许多编程语言(尤其是旧的商业语言,例如 COBOL)支持 BCD 数字(二进制​​编码的十进制)的原因,其中每个数字都被自己编码为 4 位(如十六进制而不使用 AF)。

价格的通用解决方案:以美分/便士计算并打印 NUMBER/100。

其他解决方案的说明(此处提供的功能):它们可能对某些数字有所帮助,但大多数情况下失败,例如 859.38499999。


est*_*ani 8

toFixed从来没有四舍五入也不是为了它。

它几乎不会将浮点数(指数、尾数)转换为定点数(整数、小数)(参见定义)。

这样做时,它可能看起来像是四舍五入,因为四舍五入的数字是最接近原始浮点表示的近似值。

可悲的是,它被广泛传播,toFixed可用于四舍五入......好吧,它不能,即使顾名思义也与它无关。

如果您需要舍入加上toFixed填充:

function round(num, precision) {
  var base = 10 ** precision;
  return (Math.round(num * base) / base).toFixed(precision);
}
Run Code Online (Sandbox Code Playgroud)

  • “round(148.325, 2)”给出“148.32”,因为“148.325 * 100”是“14832.499999999998” (4认同)

ken*_*bec 7

function roundup(num,dec){
    dec= dec || 0;
    var  s=String(num);
    if(num%1)s= s.replace(/5$/, '6');
    return Number((+s).toFixed(dec));
 }

 var n= 35.855
 roundup(n,2)
Run Code Online (Sandbox Code Playgroud)

/*返回值:(编号)35.86*/

  • 尝试使用`35.855`. (2认同)

小智 6

我今天遇到了同样的问题,即使尝试了其他答案中的建议,我发现我仍然没有收到我预期的结果。最后,由于我在当前项目中使用 AngularJS,当遇到这个问题时,我想我应该检查一下 AngularJS 是否已经解决了类似的问题,而且确实已经解决了。这是他们使用的解决方案,它非常适合我:

function toFixed(number, fractionSize) {
    return +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
}
Run Code Online (Sandbox Code Playgroud)

在这里找到:AngularJSfilters.js 源


joe*_*dle 6

如果您希望获得一个数字作为输出,请考虑Math.round()其他答案中的技术。

但是如果你想得到一个字符串作为输出,用于向人类展示,那么通常n.toLocaleString()n.toFixed().

为什么?因为它还会在人类用来阅读的大数字的头部添加逗号或句点。例如:

var n = 1859.385

n.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})

// Produces  1,859.39  in USA (locale en-US)
// Produces  1 859,39  in France (locale fr-FR)
// Produces  1.859,39  in Germany (locale de-DE)
Run Code Online (Sandbox Code Playgroud)

规范说,当undefined作为第一个参数传递时,将使用用户自己的语言环境(由操作系统指定)。不幸的是,正如链接的文档所示,Mozilla 在这种情况下使用 en-US 语言环境,但将来可能会符合规范。


jas*_*unk 5

您可以使用Math.round()将数字四舍五入。如果要舍入到特定的小数点,可以使用一些数学运算:

var result=Math.round(original*100)/100
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是不可靠的。例如,使用`35.855`进行尝试,最终将得到`35.85`(而不是`35.86`)。 (10认同)

归档时间:

查看次数:

68680 次

最近记录:

6 年,8 月 前