Java 在BigDecimal中修剪两个以上的尾随零
对于一个BigDecimal,修剪两个以上尾随零的好方法是什么 因此1.2200将打印1.22,1.0000将打印1.00 编辑并返回1.222200作为 1.2222和1.220000001作为1.220000001等。因此,不考虑前两个零,我希望修剪任何传入的0,而不是修剪非零值 一种方法是相乘,然后应用内置的微调尾随零,然后除以100。在角落案例中可能会出现问题,但我的问题中的值是基于货币的,并且永远不会超过Java设置的界限(或者它意味着我的软件正在处理以美元为单位的投标) 丑陋的解决办法如下Java 在BigDecimal中修剪两个以上的尾随零,java,bigdecimal,Java,Bigdecimal,对于一个BigDecimal,修剪两个以上尾随零的好方法是什么 因此1.2200将打印1.22,1.0000将打印1.00 编辑并返回1.222200作为 1.2222和1.220000001作为1.220000001等。因此,不考虑前两个零,我希望修剪任何传入的0,而不是修剪非零值 一种方法是相乘,然后应用内置的微调尾随零,然后除以100。在角落案例中可能会出现问题,但我的问题中的值是基于货币的,并且永远不会超过Java设置的界限(或者它意味着我的软件正在处理以美元为单位的投标) 丑陋的解决办
System.out.println(((new BigDecimal("1.230223000")
.multiply(new BigDecimal("100.0"))
.stripTrailingZeros()).divide(new BigDecimal("100.0"))));
更新:实现这些混合要求(即小数点后至少应显示2位数字,但根据需要多显示)并非易事,但您可以接近: 将
stripTrailingZeros()
与DecimalFormat
组合以获得所需的行为(或接近该行为):
这将格式化任何BigDecimal
值,小数点后至少有2位,小数点后最多有10位,如果这样可以提高精度的话
BigDecimal
小数点后超过10位的值仍将被截断:
input | output
-----------------+----------
1.20000 | 1.20
1.23000 | 1.23
1.2301 | 1.2301
1.230001000 | 1.230001
1.2300000000001 | 1.23
此代码将打印1.23
。请注意,当需要舍入时(即前两位之后的任何数字都不是零),这将抛出一个
如果您的值可以具有更高的精度,并且希望应用一些舍入,只需将舍入模式。不必要的替换为:
这将打印1.24
如果您不知道确切的位数,但希望位数尽可能少(即您希望BigDecimal
的scale
尽可能小),则调用将完全满足您的要求:
System.out.println(new BigDecimal("1.230001000").stripTrailingZeros();
这将打印1.230001
检查此项
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class DecimalFormatExample
{
public static void main(String args[])
{
double amount = 2192.015;
NumberFormat formatter = new DecimalFormat("#0.00");
System.out.println("The Decimal Value is:"+formatter.format(amount));
}
}
此方法将为您提供所需的结果(货币回合):
(什么是字符串,因为它更适合BigDecimal请参阅文档)
如果用于显示目的,请使用:
BigDecimal d = new BigDecimal("1.2200");
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);
String s = n.format(d.doubleValue());
要输出为字符串
,请使用十进制格式
否则,请使用以下命令:
public static BigDecimal stripToMinimumScale(BigDecimal value,
final int minimumScale) {
if (value.scale() == minimumScale) // Already correct scale
return value;
else {
value = value.stripTrailingZeros();
return (value.scale() < minimumScale) ?
value.setScale(minimumScale) : // Too few decimals, needs zero pad
value; // Do not round any significant digits
}
}
公共静态BigDecimal stripToMinimumScale(BigDecimal值,
最终整数(最小刻度){
如果(value.scale()==minimumScale)//比例已正确
返回值;
否则{
value=value.stripTrailingZeros();
返回值(value.scale()
注意:我的回答假设您需要该值。如果您只想格式化值的显示方式,那么@Max的答案更合适。我确实需要该值,我还想让它对以下情况起作用:BigDecimal 1.23000200000返回BigDecimal 1。230002@geoaxis:我已更新了这些更改需求的答案。请注意,您的新需求与原始需求冲突:1.230223000
如何才能转换为1.230223
,但是1.0000
应该打印1.00
?不,他们没有。再读一遍。我想忽略小数点后的前两个零进行修剪。而且输入的内容将始终至少是x.xx类型是的,我在发布我的评论后意识到了这一点。我的(更新的)答案有帮助吗?这将截断新的BigDecimal(“1.234”)
,根据新的要求,应该全部打印。这个答案已经发布,不属于“西方最快的枪”的范围
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class DecimalFormatExample
{
public static void main(String args[])
{
double amount = 2192.015;
NumberFormat formatter = new DecimalFormat("#0.00");
System.out.println("The Decimal Value is:"+formatter.format(amount));
}
}
public static float roundUp(String what, int howmuch) throws Exception{
try {
return (new BigDecimal(what).setScale(howmuch, BigDecimal.ROUND_UP)).floatValue();
} catch (NumberFormatException nfe) {
throw new Exception("BigDecimal cannot parse value : " + what, nfe);
}
}
BigDecimal d = new BigDecimal("1.2200");
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);
String s = n.format(d.doubleValue());
BigDecimal d = new BigDecimal("59.0000");
String d1 = new DecimalFormat().format(d);
System.out.println("d1 is " + d1);
public static BigDecimal stripToMinimumScale(BigDecimal value,
final int minimumScale) {
if (value.scale() == minimumScale) // Already correct scale
return value;
else {
value = value.stripTrailingZeros();
return (value.scale() < minimumScale) ?
value.setScale(minimumScale) : // Too few decimals, needs zero pad
value; // Do not round any significant digits
}
}