我正在使用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)
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)
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/
与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错误的数字.还有其他人吗?
由于在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.385 在计算机上没有表示为浮点数。它被扫描为最接近的可能值 = 859.384999999999991。将此值四舍五入为 2 位数是 859.38 而不是 859.39。
这就是许多编程语言(尤其是旧的商业语言,例如 COBOL)支持 BCD 数字(二进制编码的十进制)的原因,其中每个数字都被自己编码为 4 位(如十六进制而不使用 AF)。
价格的通用解决方案:以美分/便士计算并打印 NUMBER/100。
其他解决方案的说明(此处提供的功能):它们可能对某些数字有所帮助,但大多数情况下失败,例如 859.38499999。
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)
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*/
小智 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 源
如果您希望获得一个数字作为输出,请考虑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 语言环境,但将来可能会符合规范。
您可以使用Math.round()将数字四舍五入。如果要舍入到特定的小数点,可以使用一些数学运算:
var result=Math.round(original*100)/100
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68680 次 |
| 最近记录: |