为什么此函数会增加错误的十进制值
Why this function increase wrong decimal values?
可能重复:
JavaScript的浮点数学坏了吗
在JavaScript 中舍入浮点值
为什么这个函数会增加错误的十进制值?我只想显示一个小数。
var valueElement = $('#valueTempe');
function incrementValue(e){
if(valueElement.text() < 6){
valueElement.text(Math.max(parseFloat(valueElement.text()) + e.data.increment));
}
return false;
}
$('#plus').bind('click', {increment: 0.1}, incrementValue);
$('#minus').bind('click', {increment: -0.1}, incrementValue);
jsFiddle:测试
同样,1/3
不能用十进制精确表示,0.1
不能用二进制精确表示,Javascript数字是二进制浮点值。
在Javascript中,0.2 + 0.1
返回0.30000000000000004
请在浏览器控制台中尝试。
实际上,53位可用于存储Javascript 64位浮点值中的尾数,二进制四舍五入到53位精度的十进制值0.1
为0.00011001100110011001100110011001100110011001100110011010
当转换回十进制时正是0.1000000000000000055511151231257827021181583404541015625
。
我们可以在Firefox中使用toFixed
来显示这一点(其他浏览器将参数限制为20(:(0.1).toFixed(55)
返回CCD_ 10。
同样,二进制四舍五入到53位精度,然后转换回十进制的十进制值0.2
正是0.200000000000000011102230246251565404236316680908203125
。
如果我们把0.1
和0.2
的两个二进制表示相加,四舍五入到53位,然后转换回十进制,我们就得到了0.3000000000000000444089209850062616169452667236328125
。
因此,Javascript中0.1
+0.2
的结果不是0.3
,而是小数点后17位的0.30000000000000004
。
事实上,0.3
无论如何都不能用二进制本身来精确表示
它实际上存储为十进制值的二进制等价物0.29999999999999993338661852249060757458209991455078125
这就是为什么在Javascript中
CCD_ 22返回CCD_。
十进制到二进制
如果2
是十进制数分母的唯一质因子,则十进制数只能用二进制精确表示
例如,0.1
是1/10
,而10
有素因子2
和5
,因此没有精确的表示0.5
是1/2
,而2
的唯一素因子是2
,所以它可以被精确地表示。
您可以使用.toFixed(1(,如下
var valueElement = $('#valueTempe');
function incrementValue(e){
if(valueElement.text() < 6){
valueElement.text(Math.max(parseFloat(valueElement.text()) + e.data.increment).toFixed(1));
}
if(valueElement.text() == 6){
valueElement.text(Math.max(parseFloat(valueElement.text()) -1).toFixed(1));
}
return false;
}
$('#plus').bind('click', {increment: 0.1}, incrementValue);
$('#minus').bind('click', {increment: -0.1}, incrementValue);
演示
- Node.js v6.2.0类扩展不是函数错误
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 我如何修复包含在captcha的addthis中的错误
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- CKFinder 3为所选文件返回错误的URL
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 铬:“;未捕获的语法错误:意外的标记:"
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 相位器状态未捕获参考错误
- 当mysql提供十进制纬度和经度时,谷歌地图显示错误的地图
- 十进制到错误的结果
- 如何解决十进制验证码中的错误
- 为什么我在提交到OData Edm时会出现错误.十进制类型
- Globalize.js十进制数验证的值错误
- 为什么此函数会增加错误的十进制值