展开全部
原来 Math.log(1000) 不是3,这个 Math.log() 其实是 Math.ln(),它以e为底的对数,搞错了,原来我想 Math.log(1950) = 3.x 取整就是3,表示它62616964757a686964616fe58685e5aeb931333332643232后面有3个000,也就是先缩小1000倍取整后再放大1000倍。不过 JDK 1.5+ 提供了 Math.log10() 函数。
想来更简单的方法是直接用
BigDecimal.setScale(0, BigDecimal.ROUND_FLOOR).setScale(12);
先 Math.log10(input) 知道它有多少位 p,缩小 10^ (p-1) 倍得到前2位整数,抹掉小数位,再放大 10^ (p-1) 倍得到结果。
这个 ROUND_FLOOR 直接截尾数,再拉长到原来的精度。
如果想只留2个成为 09.12,那就得 new DecimalFormat("00.0000000000").format(input);BigDecimal input = new BigDecimal("1234567890.123456789012");
int scale = input.scale();
BigDecimal power = new BigDecimal(String.valueOf(new BigDecimal(Math.log10(input.doubleValue())).intValue() - 1));
System.out.println("Input :" + input + ", scale :" + scale + ", Power : 10^" + power);
power = new BigDecimal("10").pow(power.intValue());
BigDecimal output = input.divide(power, 0, BigDecimal.ROUND_FLOOR);
System.out.println("Output :" + output.setScale(12).multiply(power));
System.out.println("Input :" + input + ", Output :" + input.setScale(2, BigDecimal.ROUND_FLOOR).setScale(input.scale()));
输出如下:Input :1234567890.123456789012, scale :12, Power : 10^8
Output :1200000000.000000000000
Input :1234567890.123456789012, Output :1234567890.120000000000