【问题标题】:JavaScript - While loop - odd numbers exponentiation [duplicate]JavaScript - While 循环 - 奇数求幂 [重复]
【发布时间】:2018-10-11 10:06:27
【问题描述】:

我发现 JavaScript 求幂 While 循环代码存在一些问题:

var x = Number(prompt("X:"));
var y = Number(prompt("Y:"));
var count = 1;
var power = 1;
while(count <= y){
	power = power * x;
	console.log (x + " to the power of " + count + " is: " + power);
	count++;
}
这是一个简单的数学公式 X^Y。 在 X=5 和 Y=25 的情况下,它会一直运行到 Y=23。 X个奇数似乎有问题。例如。 X=3 和 Y=35。 Y=34 时的错误结果。乘法过程中缺少“1”。有人可以解释为什么会这样吗?

【问题讨论】:

  • 您不能以 64 位存储无限的数字。这就是为什么数字有时会失去准确性。
  • 这对我来说似乎是舍入错误。
  • 不清楚您所说的“在乘法过程中缺少 1”是什么意思。运行 sn-p 似乎工作正常,但肯定需要检查值是否溢出。
  • @JonasW.,这个问题真的是Is floating point math broken?的重复吗?
  • @xianshenglu 是的,答案概述了数字在 js 中的工作原理,这就是这个问题的全部内容。

标签: javascript while-loop exponentiation


【解决方案1】:

你最好对 js 中的 isSafeInteger 有所了解:

3 的 33 次方是:5559060566555523

3 的 34 次方是:16677181699666568

3 的 35 次方是:50031545098999704

console.log(
  Number.isSafeInteger(5559060566555523),
  Number.isSafeInteger(16677181699666568),
  Number.isSafeInteger(50031545098999704)
)

一个安全的整数是一个整数

可以精确地表示为 IEEE-754 双精度数,并且 其 IEEE-754 表示不能是对任何其他整数进行四舍五入以适应 IEEE-754 表示的结果。

例如,2^53 - 1 是一个安全整数:它可以被精确表示,在任何 IEEE-754 舍入模式下都没有其他整数对其进行舍入。相比之下,2^53 不是安全整数:它可以在 IEEE-754 中精确表示,但整数 2^53 + 1 不能在 IEEE-754 中直接表示,而是在四舍五入下舍入为 2^53-到最近和舍入到零的舍入。安全整数包括从 -(2^53 - 1) 到 2^53 - 1 的所有整数(± 9007199254740991 或 ± 9,007,199,254,740,991)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2013-12-20
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多