Geo*_*rge 2 python java clojure
请有人帮助我使用java浮动.我观察到一些与java的不一致,例如
Math.pow(10.0,-2)==0.01
Math.pow(10.0,-3)=0.0010 (instead of 0.001)
Math.pow(10.0,-4)=1.0 E-4
printf("%g",Math.pow(10,-4)) =0.000100000
Run Code Online (Sandbox Code Playgroud)
而使用Python:
10**-1=0.1
10**-2=0.01
10**-3=0.001
Run Code Online (Sandbox Code Playgroud)
随着Clojure 1.4
(Math/pow 10 -2) = 0.01
(Math/pow 10 -3) = 0.001
Run Code Online (Sandbox Code Playgroud)
我的问题是,与Python相比,如何在Java中获得类似的结果.换句话说,如何在没有任何尾随零的情况下获得精确的结果.为什么添加这些尾随零,是否有任何方法可以抑制它们.
很容易解释尾随零的来源.
对于%g
很简单:%g
总是默认显示6显著位,所以你会看到
1.00000
0.100000
0.0100000
0.00100000
0.000100000
1.00000e-5
1.00000e-6
...
Run Code Online (Sandbox Code Playgroud)
您可以通过将精度设置为1个有效数字来摆脱它们,但您可能不希望这样,因为例如,它也会围绕2.5到3.
执行a println
直接显示结果(a double
)的表示形式,如下所示Double.toString()
:
结果是一个字符串,表示参数的符号和大小(绝对值).[...]幅度为m:
[...]
如果m大于或等于10 -3但小于10 7,那么它表示为m的整数部分,以十进制形式表示,没有前导零,后跟'.' ('\ u002E'),后跟一个或多个十进制数字,表示m的小数部分.
[...]
如果m小于10 -3或大于或等于10 7,则它以所谓的"计算机化科学记数法"表示.让Ñ是唯一的整数,使得10 Ñ ≤ 米 <10 Ñ 1 ; 然后让一个是的数学上精确的商数米和10 Ñ使得1≤ 一个然后<10的大小被表示为的整数部分一个,作为一个单一的十进制数字,后跟"" ("\"),再后面是表示小数部分十进制数字一个,后面跟有字母"E"("\ u0045"),随后的表示Ñ为十进制整数,作为由该方法制备
Integer.toString(int)
.
[...]
m或a的小数部分必须打印多少位?必须有至少一个数来表示小数部分,并且除此之外,需要来唯一地区分型双的相邻值的参数值,作为许多,但仅作为许多,多个数字.
因此你看
1.0
0.01
0.0010
1.0E-4
9.999999999999999E-6
1.0E-6
...
Run Code Online (Sandbox Code Playgroud)
那么如何摆脱尾随的零呢?
一种方法是使用BigDecimal
,它有一个stripTrailingZeros()
方法.但你必须小心如何使用它:
System.out.println(BigDecimal.TEN.pow( -4 ,MathContext.DECIMAL64).stripTrailingZeros());
Run Code Online (Sandbox Code Playgroud)
将打印预期的
0.0001
Run Code Online (Sandbox Code Playgroud)
但
System.out.println(new BigDecimal(Math.pow(10,-4)).stripTrailingZeros());
Run Code Online (Sandbox Code Playgroud)
将打印
0.000100000000000000004792173602385929598312941379845142364501953125
Run Code Online (Sandbox Code Playgroud)
因为这恰好double
是最接近10 -4的精确值.
如果您不想在BigDecimal
s中完成所有数学运算,那么您可以获得舍入结果的字符串表示%g
(这使您有机会控制精度),从中获取BigDecimal
并打印结果:
System.out.println(new BigDecimal( String.format("%g", Math.pow(10,-4) ) ).stripTrailingZeros());
Run Code Online (Sandbox Code Playgroud)