Java获取N的n次方的精确值

3

我有一个简单的问题。

样本输入:

第一项输入 95.123

第二项输入 12

将第一项输入值提高到第二项输入值必须给出幂的确切值。 像这样: 548815620517731830194541.8990253434157159735359672218698

我做得还不够好。

这是我到目前为止所做的。 我认为我错过了什么

System.out.println("Input One");
Scanner scanner = new Scanner(System.in);
Double inputOne = scanner.nextDouble();
System.out.println("Input Two");
Double inputTwo = scanner.nextDouble();
Double result = Math.pow(inputOne, inputTwo);
BigDecimal big = new BigDecimal(result);
System.out.println(big);

我错过了什么?

1
我认为结果太大了,无法适应double(这是Math.pow返回的内容)。 - Radu Murzea
3个回答

10
你一开始使用的是double,但double不能精确地表示95.123。然后你再使用Math.pow处理double值,这样会进一步损失精度。将已经丢失精度的值转换为高精度值是没有意义的,它不可能神奇地恢复数据。
只需将一个字符串作为第一个参数传递给BigDecimal构造函数,并使用BigDecimal.pow进行计算即可。
示例代码:
import java.math.BigDecimal;

public class Test {

    public static void main(String[] args) {
        BigDecimal inputOne = new BigDecimal("95.123");
        int power = 12;
        BigDecimal result = inputOne.pow(power);
        System.out.println(result);
    }
}

输出:

548815620517731830194541.899025343415715973535967221869852721

(看起来您期望的值实际上被截断了...确切的值应该以1结尾,因为312以1结尾。)


他将数字218698截断。 - Suzan Cioc

2

在执行 pow 操作之前,您需要使用 BigDecimal。例如,以下代码将返回预期的结果:

System.out.println(new BigDecimal("95.123").pow(12));

请注意,传递给 BigDecimal 的值必须是一个 String,因为 double 没有足够的精度来保存精确值。


1

使用 BigDecimal#pow 而不是 Math.pow


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接