带有 (.0) 小数的数字在 Javascript 中被视为整数?

时间:2021-05-03 19:58:39

标签: javascript floating-point integer precision

我正在验证它应该只允许整数,我有这样的事情:

let value = '32230.13';

if(!!Number.isInteger(+value.replace(/[^0-9\.]/g, ''))) {
  // stuff
}

绝对不是最漂亮的方法,但它对我们来说很好用,直到我们得到以 .0 结尾的值。所以我注意到以 .0 结尾的值被认为是整数。例如:

console.log(Number.isInteger(100.0)) // expected `false` got `true`
console.log(Number.isInteger(100.00)) // expected `false` got `true`

所以我开始研究一些关于整数的问题,我找到了这个答案 https://stackoverflow.com/a/56393941/7602110,但它让我认为这是我们在使用 Javascript (WTFJS) 时必须处理的一些奇怪的 JavaScript 问题.我什至找到了类似的 https://github.com/denysdovhan/wtfjs,甚至去尝试用不同的编程语言做同样的事情,我得到了预期的结果 100.0 不是整数,但我仍然有一些问题:

  • 100.0 是整数吗?

    • 如果是,Javascript 方法 (Number.isInteger) 是否错误?
      • 我是否应该打开一个拉取请求,将它添加到 wtfjs(这个不重要,哈哈)?
  • 我该怎么做才能真正忽略被视为整数的 .00 值。

1 个答案:

答案 0 :(得分:2)

Javascript 标准实际上非常清楚“数学值”和以语言 (https://262.ecma-international.org/11.0/#sec-mathematical-operations) 表示的 Numbers 之间的区别

从数学的角度来看,100.0 绝对是一个整数。从 JS 的角度来看,isInteger(100.0)true,因为 isInteger 被定义为为 true 返回 Numbers,其数学值为整数。

您的不确定性来自于在其他一些语言中,100100.0 确实是完全不同的东西,具有不同的存储机制和对它们执行的操作的性质。在 Javascript 中,我们实际上不知道特定数字是如何存储的,也无法控制它。标准规定所有 Numbers 都应该表现得好像它们都是 IEEE 754-2019 双精度值,但是当您计算 1+2 时特​​定引擎实际执行的操作序列以及它们与 {{ 有何不同1}} 取决于该引擎。

相关问题