【问题标题】:Get nth digit after decimal point获取小数点后第n位
【发布时间】:2020-05-22 02:22:09
【问题描述】:

获取数字的小数点后第 207 位最有效的方法是什么?会不会只是x * Math.pow(10,207) % 10

【问题讨论】:

标签: java greenfoot


【解决方案1】:

python 怎么样

int((x*(10**n)))%10   

【讨论】:

    【解决方案2】:

    你想要的都是不可能的。

    java 中唯一可以使用Math.pow 和基本运算符的东西是原语。唯一的浮点原语是floatdouble。这些是 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 不是原始的,因此不支持 +、% 等运算符。

    【讨论】:

    • 不正确。您将精度与范围混淆了。您可以使用 OP 的公式正确恢复 1.0E-207 到 9.0E-207。
    【解决方案3】:

    ***特别注意:这里没有:“这将处理所有情况”答案,因为诸如 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
    

    【讨论】:

    • 拒绝投票的原因:答案具有误导性。任何给定的 double 或 float 的第 207 位是没有意义的。 Math.pow(10, 207) IS 可表示(勉强) - Math.power(10, 308) 是 10 的最大幂,它不仅会产生“无穷大”,而且试图用它来“提取第 207 位”是没有意义的.双打没有 207 位的精度。差远了。你用这个公式得到的数字是任意的。 random.nextInt(10) 如果这是您想要的,效率会更高。
    • @rzwitserloot 在这个公式中尝试5.0E-207,或者OP的,然后请解释结果。他将预测与范围混为一谈。您在谈论数字,但 OP 正在谈论小数位。
    • 理解并同意.. 我不喜欢反对票但是因为我只使用了用户在问题中提供的具体的、看似任意的值...我将编辑我的答案以明确任何人可以提供的任何答案的条件都仅限于基于变量类型的合理精度期望
    • @DynasticSponge 我不同意,我提出的实验也不同意。 FP 数的第 207 位小数不一定是无意义的,也不一定是小数点到 307 或任何最大值。
    • 我猜我认为 OP 正在寻找一个数字,因为原始帖子中的 % 10 ......还有.. 我认为我的“我同意”是有一些帖子滞后对于 rzwitserloot... 不同意 user207421
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2010-11-12
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多