Javascript数字表示法

Javascript数字表示法,javascript,computer-science,number-formatting,Javascript,Computer Science,Number Formatting,这是一个著名的例子,在javascript控制台中,日志记录0.1+0.2会产生 0.1 + 0.2 = 0.30000000000000004 对此的典型解释是,这种情况的发生是因为javascript表示数字的方式。 我有两个问题: 1) 为什么javascript决定如何表示数字——决定如何表示数字不是“环境”(不管它是在编译代码,是浏览器还是其他什么)的工作吗 < 2)为什么不可能将这个行为与大多数编程语言(java,C++等)相匹配?我的意思是——如果这种行为不是很好(大多数人都同意

这是一个著名的例子,在javascript控制台中,日志记录0.1+0.2会产生

0.1 + 0.2 = 0.30000000000000004
对此的典型解释是,这种情况的发生是因为javascript表示数字的方式。 我有两个问题:

1) 为什么javascript决定如何表示数字——决定如何表示数字不是“环境”(不管它是在编译代码,是浏览器还是其他什么)的工作吗

< 2)为什么不可能将这个行为与大多数编程语言(java,C++等)相匹配?我的意思是——如果这种行为不是很好(大多数人都同意不是),为什么不可能修复呢。(道格拉斯·克罗克福德(Douglas Crockford)展示了其他javascript缺陷,例如“this”的怪异行为,这种情况已经持续了20年。)。是什么阻止javascript修复这些错误

为什么javascript决定如何表示数字——它不是“环境”吗

那将是一片混乱。通过让JavaScript定义其基本类型的行为,我们可以依靠它们在不同环境中以这种方式进行行为

好吧,“混乱”相当强烈。我相信C从来没有定义过什么
float
double
实际上是一些范围限制之外的东西,可以公平地说,C曾经并且可以说是非常成功的,“混乱”等等。不过,现代的趋势是把事情搞得更清楚一点

为什么不可能将这个行为与大多数编程语言(java,C++等)< /P>匹配? 这是大多数现代编程语言的行为。大多数现代编程语言使用单精度浮点数(通常为“
float
”)和双精度浮点数(通常为“
double
”):

  • JavaScript:

    数值

    与双精度64位二进制格式IEEE 754值相对应的原语值

  • 爪哇:

    浮点类型为
    float
    double
    ,概念上与IEEE二进制浮点算法标准ANSI/IEEE标准754-1985(IEEE,纽约)中规定的单精度32位和双精度64位格式IEEE 754值和运算相关联

  • C#:

    C#支持两种浮点类型:
    float
    double
    float
    double
    类型使用32位单精度和64位双精度IEEE 754格式表示


我已经接触java很久了:你完全正确,它的行为也一样。然而,这仍然不能回答为什么其他缺陷会被保留20年…@Joel_Blum你提到的缺陷是琐碎的,更大的问题应该首先解决。尽管下一个版本将有箭头函数,其中包含词法
这个
@Joel\u Blum:Crockford称为“缺陷”的许多东西都不是缺陷;它们只是没有按照Crockford认为应该的方式工作。在某些情况下,很多人都同意他的观点;在其他情况下,他们没有。如果你看看第5版规范和即将发布的第6版规范,你会发现有很多非常聪明的人在改进JavaScript——包括采纳Crockford的一些建议。JavaScript是一种几乎独一无二的难以增强的语言,因为它有如此多的实现,以及如此多的冲突利益相关者。@Joel_Blum:关于“冲突利益相关者”:1999年规范最终出台后,语言中最大的利益相关者之间发生了多年的争执和分歧。布伦丹·艾奇(Brendan Eich)在多年后终于打破了僵局,但这并不容易,要做到这一点,需要在第五版中保留很多内容,因为利益相关者无法就这些内容达成一致。他和Mozilla本可以说:“就是这样,你被卡住了。”但这几乎肯定会以一种极为适得其反的方式打破局面。我不明白为什么要否决这个问题。我是说,我想可能有点咆哮,但是。。。