为什么在JavaScript中,10 * (7/10) = 7?

3

表达式(7/10)中的7和10都是整数,因此结果0.7也应该是整数,即0。整个表达式的结果也应该是0。但是,实际返回的却是7,为什么?是忽略了括号还是自动转换为double类型?


2
结果不取决于输入的格式,10/42.5 - 把它变成 3 是错误的,也很烦人,因为这意味着在求和时必须将所有数字写成可能的小数精度,即 10.0/4.0,而对于 10/3 就行不通了 --- 这个结果是完全可以预料的。 - MDEV
7个回答

11

JavaScript不区分整数和浮点数,我认为一切都被视为双精度浮点数,这就是你得到结果的原因。

请查看MDN上Number属性的详细信息。


1
“我不是W3School的粉丝,但可以看看它们关于Number属性的详细信息。”-- 为什么?难道MDN文章 不够好,甚至更好吗? - John Dvorak
@JanDvorak:我不经常使用JavaScript进行开发,所以不知道“MDN”。不过还是谢谢你,我会把它加入书签。 - Ian
@Ian:JS使用的类型是“Number”,在强类型语言中,它将是一个64位IEEE 754浮点数。 - Elias Van Ootegem
1
W3schools说:“您可以使用toString()方法将数字输出为基数16(十六进制),基数8(八进制)或基数2(二进制)”。MDN说:“参数:radix-一个介于2和36之间的整数,指定用于表示数字值的基数”。猜猜哪个是正确的? - John Dvorak
1
@EliasVanOotegem 当然可以,但是在Javascript中的Number对应于大多数其他强类型语言中所称的double - John Dvorak
显示剩余3条评论

7

JavaScript中没有int和double

在JavaScript中,int、float和double都被规范化为可以共同使用的类型。它们被视为1(它们被视为Number,这是一个IEEE 754浮点数。感谢@Elias Van Ootegem)。平等、自由和友爱,因此;

10*0.7 = 7

JavaScript不像C语言。


它们不被视为double,而是被视为“Number”,这是IEEE 754浮点数。 - Elias Van Ootegem

7

JavaScript没有整数类型、双精度类型或浮点类型......它只有一种数字类型:被称为Number类型的有用类型(尝试使用var foo = new Number(7);var foo = Number('123string');)。

现在,我知道我说过JS不知道浮点数,但这并不完全正确。所有Number类型的变量/值本质上都是64位浮点数,由IEEE 754标准定义(正如Jan Dvorak友善地指出的那样,在大多数静态类型语言中它们是double),具有带来的所有注意事项:

(.1 + .2);//0.30000000000000004

但那不是重点。重点是,在JS中你可以执行浮点数+整数运算而无需进行内部强制转换或转换。这就是为什么10*(7/10)总是等于7的原因。


5

Javascript没有整数,即使有,也没有规定/必须返回一个整数(只因为其他语言可能这样做,并不意味着每种语言都必须如此)。该操作的结果是一个float/Number,就像所有Javascript数字一样。


特别感谢您提出一点,即“/”不必返回整数。 - Max Koretskyi

1
JavaScript使用动态类型。这意味着变量可以像这样:
var str = "hi";

可以稍后变成:
str = 123; //now we have an 'int'
str += 0.35; //now str is 123.35, a 'float'

因此,JavaScript不会将浮点数强制转换为整数。

如果您想要强制进行“转换”,则必须执行以下操作:

var integer = parseInt( 3.14*9.0291+23, 10 ); //the second parameter (10) is the 'base'

但是请记住,JavaScript 不会处理类型,这是你的责任。


在调用 parseInt 时,始终指定基数。当涉及到类型处理时,JS 做得相当不错(9/10)。例如:var someVar = 1, aString = 'The result of the sum is: ' + (someVar + 123/3) + ' not ' + 1。变量 aString 将保存:the result of the sum is 42 not 1。 - Elias Van Ootegem
如果您向 parseInt 传递一个数字,该数字将以一种无法使 parseInt 猜错的方式被转换为字符串 ;-) - John Dvorak
@JanDvorak:我知道,但养成这个好习惯很重要。不出几天你就会在用户输入上使用parseInt,而结果可能会与你预期的不同... - Elias Van Ootegem

1
尝试这个。
10*parseInt(7/10)

希望这能帮到你。

1
如果你试图遵循规则,那么

10 * (7/10) --> 10 * .7 --> 7

你不能改变结果的方式。

因此,结果0.7也应该是整数,即0

如果你想要这样做,请尝试使用

Math.Floor();

这会将小数转换为最接近的整数!或者尝试使用parse()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接