根据Is floating point math broken?,0.1会被四舍五入到某个值,因为1/10无法准确表示。但我的问题是,如何将硬编码的十进制数组合起来?
var a=0.1;
是否会转换为与var a=1/10;
相同的值?
或者一般来说,var a=x.yz;
是否会转换为与var a=xyz/100;
相同的值?
答案 0 :(得分:0)
当使用IEEE 754算法时,正常操作就像计算精确的数学结果一样,然后使用舍入规则的几个选项之一将其四舍五入到最接近的可表示值,每个选项都是确定性的并且舍入到最接近的值在某个方向。有了这种行为,将源文本“ x 。 yz ”转换为浮点类型并将 xyz 除以100的操作相同的类型必须具有相同的结果。
标准化JavaScript的ECMA-262 specification表示Number类型的值“代表IEEE二进制浮点运算标准中规定的双精度64位格式IEEE 754-2008值”,除了只使用一个NaN。它进一步说“数学运算,如加法,减法,否定,乘法,除法,以及本节后面定义的数学函数,应始终被理解为计算数学实数上的精确数学结果......”后来有文字描述如何精确数学结果用于选择数字结果,包括“选择该组中与x最接近的成员。如果该组的两个值同样接近,......“语法和结构有点倾斜,但我认为其意图主要是为了符合IEEE 754的操作。
将字符串中的十进制数字(尤其是浮点数/科学计数法十进制数,如1.2345e12)转换为浮点数一直是某些编程语言或其实现的难点。并不总是理解这是一个数学运算:十进制数字被转换为浮点值。作为一种数学运算,它应该被相同的规则所覆盖:结果应该好像操作是用精确的数学运算,然后在选定的方向上四舍五入到最接近的可表示值,具有解决关系的确定性规则。该标准包含一个注释,引用人们关于正确执行这些转换的经典论文,所以我的解释是它打算正确执行这些转换。
鉴于此,在符合ECMA-262的JavaScript中, xy 。 z 应与 xyz / 100具有相同的值。对于那些更熟悉ECMA-262标准的人,我愿意接受我的解释。