我想要的是一种将double转换为使用half-up方法进行舍入的字符串的方法 - 即如果要舍入的小数为5,则它总是向上舍入到前一个数字.这是在大多数情况下舍入大多数人所期望的标准方法.
我也希望只显示有效数字 - 即不应该有任何尾随零.
我知道这样做的一种方法是使用该String.format方法:
String.format("%.5g%n", 0.912385);
Run Code Online (Sandbox Code Playgroud)
收益:
0.91239
Run Code Online (Sandbox Code Playgroud)
这很好,但它总是显示5位小数的数字,即使它们不重要:
String.format("%.5g%n", 0.912300);
Run Code Online (Sandbox Code Playgroud)
收益:
0.91230
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用DecimalFormatter:
DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);
Run Code Online (Sandbox Code Playgroud)
收益:
0.91238
Run Code Online (Sandbox Code Playgroud)
但是你可以看到这使用了半均匀舍入.也就是说,如果前一个数字是偶数,它将向下舍入.我想要的是这个:
0.912385 -> 0.91239
0.912300 -> 0.9123
Run Code Online (Sandbox Code Playgroud)
在Java中实现这一目标的最佳方法是什么?
我想模仿这个功能.我想将浮点数舍入到最接近的0.05的倍数(或者通常是最接近的倍数).
我要这个:
>>> my_magical_rounding(1.29, 0.05)
1.25
>>> my_magical_rounding(1.30, 0.05)
1.30
Run Code Online (Sandbox Code Playgroud)
我可以做这个:
import math
def my_magical_rounding(n, r):
return n - math.fmod(n, r)
>>> my_magical_rounding(1.27, 0.05)
1.25 # Yay!
>>> my_magical_rounding(1.30, 0.05)
1.25 # Boo! I want 1.30.
Run Code Online (Sandbox Code Playgroud)
大概是由于浮点舍入.
我可以进行一些特殊情况检查,看看它n是否"足够接近" r而不进行减法,这可能会有效,但是有更好的方法吗?
或者这个策略是我最好的选择吗?