toFixed javascript函数给出奇怪的结果
toFixed javascript function giving strange results?
我正在尝试将数字固定为小数后的2位,为此我使用javascript的toFixed
函数。以下是我得到的奇怪结果,请检查并帮助我。
var数=11.995;number.toFixed(2);// 给我11.99,哪个是正确的var数=19.995;number.toFixed(2);// 给我20.00,这是不正确的
有人能告诉我为什么会发生这种事吗。
谢谢你的帮助。
这就是浮点数学的工作原理。值19.995不是精确的二进制(以2为基数)。为了更清楚,当你除以10/3时,想一个确切的数字。
如需更深入的解释,请阅读以下内容:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
在您的情况下,您可以使用字符串(至少看起来这是您想要的):
number.toString().substr(0, n);
或者定义这样的函数(2分钟内完成,只是一个例子):
Number.toFixed = function(no, n) {
var spl = no.toString().split('.');
if ( spl.length > 1 ) {
return spl[0]+'.'+spl[1].substr(0,n);
}
return spl[0];
}
Number.toFixed(19.995, 2); // 19.99
toFixed
对该值进行四舍五入。由于19.995正好介于19.99和20.00之间,因此必须从中选择一个。传统上,四舍五入更喜欢偶数结果(这可以防止偏差,因为上舍入和下舍入是相等的)。
我创建了一个函数,它为我完成了所有任务。
function toFixed(number, precision) {
var multiplier = Math.pow(10, precision + 1),
wholeNumber = Math.floor(number * multiplier);
return Math.round(wholeNumber / 10) * 10 / multiplier;
}
//Call this function to retrive exect value
toFixed((+adjustmentval), 2);
为此,可以使用Math对象的Math.floor()
方法。
类似这样的Math.floor(number*100)/100
有人能告诉我为什么会发生这种事吗。
JavaScript的number
类型所使用的IEEE-754双精度二进制浮点数标准(以及其他几种语言中的类似时间)并不能完美地存储所有数字,它不精确地存储了一些数字。
对于11.995
,实际值为11.99499988555908203125
,只是比11.995
稍微小。
对于19.995
,实际值为19.9950008392333984375
,仅略高于19.995
。
这就解释了为什么当您使用通常的四舍五入到最接近的半上运算对它们进行四舍五五入时,11.995
(实际上是11.99499988555908203125
)会向下舍入到11.99
,而19.995
(实际上是19.9950008392333984375
)会向上舍入到20.00
。
(这个网站有一个方便的计算器来可视化这些东西。)
更多关于SO:
- 浮点数学坏了吗
- 如何处理JavaScript中的浮点数字精度
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- 数组删除重复结果Javascript
- 比较数组中的连续元素不会返回任何结果(javascript)
- split(' ') 函数没有给出正确的结果 Javascript
- 如何产生结果Javascript嵌套缺陷
- I'm试图使用onclick函数显示函数的结果.(javascript)
- 计算结果Javascript中不同数字的数量
- 以 HTML 格式显示计算结果 (javascript)
- 没有得到预期的结果 - javascript
- 从函数返回结果 - JavaScript
- 在一行中返回来自三元的结果(JavaScript)
- 骰子效果-如何在最后显示假结果和真结果(JavaScript)
- WebGL纹理加载结果(Javascript)类型错误
- 限制搜索结果Javascript
- IF语句多个答案-相同的结果Javascript
- 双异步循环,如何保证正确排序顺序的最终结果?(javascript)
- 添加图像到测验结果javascript
- 奇怪的结果javascript比较
- 如何改变iFrame结果JavaScript警告框