这是一个着名的例子,在javascript控制台中记录0.1 + 0.2的产量
0.1 + 0.2 = 0.30000000000000004
对此的典型解释是,由于javascript表示数字的方式而发生。 我有两个问题:
1)为什么javascript决定如何表示数字 - 是不是“环境”(无论是编译代码,无论是浏览器还是其他什么?)工作来决定它如何表示数字?< / p>
2)为什么不能修复此行为以匹配大多数编程语言(java,c ++等)。我的意思是 - 如果这种行为不是很好(并且大多数人会同意它不是),为什么不可能修复。 (Douglas Crockford展示了其他javascript漏洞,例如'this'的怪异行为,并且已经持续了20年。)什么阻止javascript来解决这些错误?
答案 0 :(得分:2)
为什么javascript决定如何表示数字 - 不是“环境”
那将是混乱。通过让JavaScript定义其基本类型的行为,我们可以依赖它们在各种环境中以这种方式运行。
好吧,“混乱”相当强烈。我相信C从来没有定义float
和double
实际上除了一些范围限制之外的东西,并且可以公平地说C是并且可以说是非常成功,“混乱”等等。尽管如此,现代趋势还是要把事情做好一点。
为什么无法修复此行为以匹配大多数编程语言(java,c ++等)
大多数现代编程语言的行为。大多数现代编程语言使用IEEE-754单个(通常是“float
”)和双精度(通常为“double
”)精度浮点数:
JavaScript:http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.19
数值
原始值对应于双精度64位二进制格式IEEE 754值
Java:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3
浮点类型为
float
和double
,它们在概念上与IEEE中指定的单精度32位和双精度64位格式IEEE 754值和操作相关联。二进制浮点运算标准,ANSI / IEEE标准754-1985(IEEE,纽约)。
C#:http://msdn.microsoft.com/en-us/library/aa691146(v=vs.71).aspx
C#支持两种浮点类型:
float
和double
。float
和double
类型使用32位单精度和64位双精度IEEE 754格式表示