【发布时间】:2021-11-06 00:57:41
【问题描述】:
我正在使用的算法需要从 Javascript 中的浮点数中提取尽可能多的精度。我不介意精度是来自一个非常大的数字还是小数点后有很多数字,我只是需要尽可能多的数字。
(如果你关心为什么,那是 drag n' drop ranking algorithm 在重新平衡之前必须处理大量减半。我也知道有更好的基于字符串的算法,但数值方法适合我的目的)
JavaScript Number 类型是双精度 64 位二进制格式 IEEE 754 值,类似于 Java 或 C# 中的 double。这意味着它可以表示小数值,但它可以存储的内容有一些限制。一个数字只保留大约 17 个小数位的精度;算术需要四舍五入。
我应该如何最好地使用“17 位小数精度”?
小数点后17位的意思是“总共17个数字,包括小数点前后的数字”
例如(为了便于阅读,添加下划线表示千位分隔符)
# 17 numerals: safe
111_222_333_444_555_66
# 17 numerals + decimal point: safe
111_222_333_444_555_6.6
1.11_222_333_444_555_66
# 18 numerals: unsafe
111_222_333_444_555_666
# 18 numerals + decimal point: unsafe
1.11_222_333_444_555_666
111_222_333_444_555_66.6
我假设数字的精度决定了您可以使用的数字的数量,并且这些数字中小数点的位置实际上是学术性的。
- 我是否正确地考虑了这个问题?
- 小数点的存在是否对计算有任何影响,或者仅仅是存在的数字数量的问题
- 我应该假设 17 个数字是安全的 / 18 个是不安全的吗?
- 这是否因浏览器而异(不仅是今天,而是超过 10 年,是否应该假设浏览器精度可能会提高)?
【问题讨论】:
-
Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER告诉您一个数字在失去精度之前可以有多大和多小。如果您需要大于此的数字,请使用BigInt -
@evolutionxbox 在每个浏览器的基础上工作,但这些数字将在一个浏览器上设置和加载,然后在另一个浏览器上使用。我需要最小的公分母。 .所以我需要一个通用标准,无论用户运行的特定浏览器支持什么,我都可以应用它。此外,这仅描述整数 - 它没有解决小数位的问题。
-
什么意思?两者都是浏览器使用的标准。这是Number compatibility 和BigInt compatibility
-
这个问题与数字WRT小数位的结构有关。小数点如何影响精度以及小数点右侧或左侧是否有更多数字或是否只是数字的绝对数量是否会有所不同。所以
Number.MAX_SAFE_INTEGER计算为 9007199254740991。但是 9007199254740990.1 是安全的还是不安全的。它小于 9007199254740991,但它带有更多的数字。我的第二点是,一个浏览器可能从 Number.MAX_SAFE_INTEGER 返回的内容和另一个浏览器可能返回的内容可能不同。我需要液晶显示器 -
“我的第二点是,一个浏览器可能从 Number.MAX_SAFE_INTEGER 返回的内容和另一个浏览器可能返回的内容可能不同” - 不。这不是真的(好吧,无论如何我对此很有信心)。所有使用 JS 的浏览器都使用相同的数字格式。 --- 另见stackoverflow.com/questions/45929493/…
标签: javascript precision