【问题标题】:Some Java Modulo / Remainder operator questions一些 Java 模数/余数运算符问题
【发布时间】:2011-07-21 17:09:50
【问题描述】:

我一直在玩 Java 的一些更大的价值,但我遇到了一些我不理解的东西。出于某种原因,Java 似乎喜欢给我 bum 数据(尽管我更可能告诉它给我 bum 数据)

这是一个 sn-p,为清楚起见进行了编辑:

        System.out.println(
                "2 == " + (Math.pow(51, 13) % (77))
        );

根据 Wolfram Alpha(参见下面的链接),我的算法的其余部分都是错误的。

(输出:)

  2 == 70.0

http://www.wolframalpha.com/input/?i=51^13+mod+77

有什么想法吗?

【问题讨论】:

    标签: java modulo


    【解决方案1】:

    我相信这是因为精度问题。 doubles 只能精确到 15 位左右。 Math.pow(51,13) 是一个巨大的数字(约 20 位数字),因此当您尝试将其修改为 77 时,您将遇到数字错误。

    对于任意精度算术,请查看BigIntegerBigDecimal

    【讨论】:

    • 我也这么认为,但是 double 的 MAX_VALUE 为 (2-2^52)·2^1023,我认为这比我的数字大。想法?
    • 这不是范围问题,而是精度问题。例如,如果存储数字 0.12345678987654321,double 可能会将其截断为仅 0.123456789。同样对于大数,12345678987654321 可能会被截断为 12345678900000000。显然这会破坏后续 mod 的准确性。
    • 这听起来很正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2023-01-18
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多