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);

我错过了什么?

4

3 回答 3

10

我错过了什么?

double开始使用,并且double不能准确表示 95.123。然后您使用Math.pow双精度值,这将进一步失去精度。将已经有损的值转换为高精度值是没有意义的……它无法神奇地恢复数据。

只需将一个字符串传递给第一个参数的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 结尾,因为 3 12以 1结尾。)

于 2012-10-09T19:00:26.080 回答
2

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

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

请注意,传入的值BigDecimal必须是 aString因为 adouble没有足够的精度来保存确切的值。

于 2012-10-09T19:02:18.147 回答
1

BigDecimal#pow不使用Math.pow

于 2012-10-09T19:01:57.697 回答