来看一道题(http://poj.org/problem?id=1001),如下:
Exponentiation
Time Limit: 500MS | Memory Limit: 10000K | |
Total Submissions: 111481 | Accepted: 27078 |
Description
Input
Output
Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
开始采用Java的double数据类型,始终计算不精确。
查阅资料后,想到Java中的BigDecimal数据类型。
来看看JDK中关于BigDecimal的描述——
public class BigDecimal
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是(unscaledValue × 10-scale)。
BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString()
方法提供 BigDecimal 的规范表示形式。
public BigDecimal(double val)
注:
Double.toString(double)
方法,然后使用 BigDecimal(String)
构造方法,将double 转换为 String。要获取该结果,请使用 static valueOf(double)
方法。val
- 要转换为 BigDecimal 的 double 值。
NumberFormatException
- 如果 val 为无穷大或 NaN。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
因此可以,采用BigDecimal进行计算,构造方法传入参数为String类型即可。
import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (true) { try { double a = scan.nextDouble(); int b = scan.nextInt(); System.out.println(trim0(myPower(a, b).toPlainString())); } catch (Exception e) { return; } } } public static BigDecimal myPower(double num, int n) { BigDecimal a = new BigDecimal(String.valueOf(num)); BigDecimal res = new BigDecimal("1.0"); for (int i = 0; i < n; i++) { res = res.multiply(a); } return res; } public static String trim0(String data) { int startPos = 0, endPos = data.length() - 1; while (data.charAt(startPos) == '0') startPos++; while (data.charAt(endPos) == '0') endPos--; if (data.indexOf('.') == endPos) endPos--; return data.substring(startPos, endPos + 1); } }