【发布时间】:2020-05-22 02:22:09
【问题描述】:
获取数字的小数点后第 207 位最有效的方法是什么?会不会只是x * Math.pow(10,207) % 10?
【问题讨论】:
-
最有效但不太准确。
-
对于那些认为不可能的人,请尝试OP公式中的1E-207到9E-207,然后解释结果。
获取数字的小数点后第 207 位最有效的方法是什么?会不会只是x * Math.pow(10,207) % 10?
【问题讨论】:
python 怎么样
int((x*(10**n)))%10
【讨论】:
你想要的都是不可能的。
java 中唯一可以使用Math.pow 和基本运算符的东西是原语。唯一的浮点原语是float 和double。这些是 IEEE754 浮点数;双精度为 64 位,浮点数为 32 位。
一个简单的原则适用:如果你有 64 位,那么你只能表示 2^64 个不同的数字(实际上要少一点)。所以,你得到了大约 18446744073709551616 个数字,所有存在的数字,就计算机而言,它们实际上存在于双打。 所有其他数字都不存在。
如果一个数学运算(例如,0.1 + 0.2)最终成为一个不存在的数字,会发生什么?好吧,java(这是由 IEEE754 标准预测的;大多数语言和芯片都是这样做的)会在所有存在的 18446744073709551616 数字中返回最接近的数字。
想要第 207 个数字的问题显然是,鉴于只有 18446744073709551616 个数字存在,那些 18446744073709551616 个数字都没有这种精度。因此,要求第 207 位数字是完全随机的。它没有说明输入数字......无论如何。
让我重复一遍:没有任何双精度值的第 207 位有效。
如果您想要“完美”的表示,没有任何四舍五入,您想要BigDecimal,但请注意,要求完美是棘手的。想象一下基本的十进制数学(计算机是二进制的,但让我们坚持使用十进制,因为我们都更熟悉它,我们的 10 个手指等等),我要求你只给我完美的答案,然后我问你将 1 除以 3。
BigDecimal 也不允许您这样做,因此您可以在 BigDecimals 上运行的操作而不告诉 BigDecimal 以何种方式允许不精确会导致异常。
如果您完全按照自己的意愿进行了设置,并且您确实有一个 BigDecimal,逗号后有第 207 位,您可以使用比例功能或仅使用 10 的幂功能来获得什么你想要的。
注意 BigDecimal 不是原始的,因此不支持 +、% 等运算符。
【讨论】:
***特别注意:这里没有:“这将处理所有情况”答案,因为诸如 207 之类的任意值可能会使计算方式超出所涉及的变量类型的可能精度范围。我的回答只能在变量类型精度的范围内工作,而 207 确实不可能......
要获得小数点后任意位数(如 207)的特定数字...如果您只是乘以 10.. 然后取 mod 10,答案(在 java 中)仍然是浮动的点类型...不是一个数字...
要获取特定数字,小数点后的任意位数 (n),而不转换为字符串:
Math.floor(x*Math.pow(10,n)) % 10;
to get 4th digit after 2.987654321
x*Math.pow(10, 4) = 29876.54321
Math.floor(29876.54321) = 29876
29876 % 10 = 6
【讨论】:
Math.pow(10, 207) IS 可表示(勉强) - Math.power(10, 308) 是 10 的最大幂,它不仅会产生“无穷大”,而且试图用它来“提取第 207 位”是没有意义的.双打没有 207 位的精度。差远了。你用这个公式得到的数字是任意的。 random.nextInt(10) 如果这是您想要的,效率会更高。
5.0E-207,或者OP的,然后请解释结果。他将预测与范围混为一谈。您在谈论数字,但 OP 正在谈论小数位。