2014-11-24 33 views
3

我只是偶然在Javascript非常奇怪的东西防空火炮。为什么13596 * 0.1与13596/10不同?

我的剧本是乘以0.1 13596,输出功率为:1359.6000000000001

我们都必须承认,0.1 = 1/10,所以我试了一下:

13596/10 = 1359.6 

我用Firefox测试它和Chrome,也会发生相同的结果。

我想知道,如果它是有关浮动的,所以我尝试了以下内容:

13596 * parseFloat(0.1) = 1359.6000000000001 

都能跟得上。

顺便说一句,这不等于:

(13596*0.1) === (13596/10) => false 

有没有人有这个结果的想法?

Here's the JSFiddle.

+3

因为'0.1'不是十分之一(类型'(0.1).toFixed(20)'在控制台)。 – georg 2014-11-24 15:07:33

+1

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Ryan 2014-11-24 15:08:11

+0

坎。什么? :p那么该怎么办?除以10(未由0.1乘?) – 2014-11-24 15:08:25

回答

8

记住,浮动点,一个数字,你在屏幕上看到的并不一定准确计算机建模的数量。

例如,使用node

> 1359.6 
1359.6 
> (1359.6).toFixed(20) 
'1359.59999999999990905053' 

节点显示你1359.6,但是当你要求更精确,你可以看到真正的数字是不完全是你所看到的 - 它是圆的。 0.1也是如此:

> (0.1).toFixed(20) 
'0.10000000000000000555' 

通常,当您使用浮动工具时,您在显示它们之前接受这种不精确和圆形数字。

某些数字正好可以表示,但假设浮点不精确是最安全的。例如,0.5可以精确地表示为:在JavaScript然而

> 13596/10 
1359.6 
> (13596/10).toFixed(20) 
'1359.59999999999990905053' 

整数结果之间划分在的整数。在其它语言中,:由10

> (0.5).toFixed(20) 
'0.50000000000000000000' 

除以实际产生相同的结果,通过0.1乘以所有数字都被建模为浮点。

一般来说,当您需要精确地表示你应该使用十进制数字型十进制数字,虽然这本身是不提供的JavaScript。

还没有点使用的代码作为parseFloat(0.1)0.1已经浮子。

+0

这是围绕这个问题的核心问题,这就是'0.1'不完全可以表示。我认为你可以把这个工作变成一个很好的答案。 – tmyklebu 2014-11-24 15:32:25

+0

@tmyklebu,我稍微扩展了一些答案,以强调更多示例的重点。 – 2014-11-24 15:43:48

相关问题