2

可能的重复:
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:测试

4

2 回答 2

3

同样的方式1/3不能用十进制精确表示,0.1不能用二进制精确表示,而Javascript数字是二进制浮点值。

在 Javascript中0.2 + 0.1返回0.30000000000000004.
在浏览器控制台中尝试。

实际上,53 位可用于将尾数存储在 Javascript 64 位浮点值0.1中,二进制的十进制值四舍五入到 53 位的精度
0.00011001100110011001100110011001100110011001100110011010
,当转换回十进制时正好是
0.1000000000000000055511151231257827021181583404541015625.

我们可以使用toFixedFirefox 来展示这一点(其他浏览器将参数限制为 20):
(0.1).toFixed(55)返回 0.1000000000000000055511151231257827021181583404541015625

同样,二进制的十进制值0.2四舍五入到 53 位的精度,然后再转换回十进制就是
0.200000000000000011102230246251565404236316680908203125.

0.1如果我们将and的两个二进制表示相加0.2,四舍五入到 53 位,然后再转换回十进制,我们就得到了
0.3000000000000000444089209850062616169452667236328125.

所以 Javascript 中0.1+的结果0.2不是0.3但是,小数点后 17 位是0.30000000000000004.

事实上,0.3无论如何都不能用二进制本身精确表示。
它实际上存储为十进制值的二进制等价物,
0.29999999999999993338661852249060757458209991455078125
这就是 Javascript 中
0.2 + 0.1 == 0.3返回false.


十进制到二进制
十进制数只能用二进制精确表示,如果2它是用最低术语表示为简单分数时数字的分母的唯一质因数。
例如,
0.11/10, 并且10有素因数25,所以没有精确的表示。
0.51/2,而唯一的素因子22,所以它可以被精确地表示。

于 2013-01-18T12:05:35.893 回答
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);

演示

于 2013-01-18T12:05:10.823 回答