长格式小数分隔符(Java/Spring)
我需要将十进制分隔符点放在一个较长的位置,我尝试了几种方法,但我需要它是动态的,因为十进制分隔符可以更改,我尝试了长格式小数分隔符(Java/Spring),java,spring-boot,numberformatter,Java,Spring Boot,Numberformatter,我需要将十进制分隔符点放在一个较长的位置,我尝试了几种方法,但我需要它是动态的,因为十进制分隔符可以更改,我尝试了DecimalFormat format=new DecimalFormat(“#####”)但这不是动态的,也不是我想要的方式 例1 多头金额=123456 int-decimal=2 结果应该是双倍的newAmount=1234.56 例2 多头金额=123456 int-decimal=4 结果应该是双倍新金额=12.3456如果我理解正确,这就是您试图实现的目标: Long
DecimalFormat format=new DecimalFormat(“#####”)代码>但这不是动态的,也不是我想要的方式
例1
多头金额=123456代码>
int-decimal=2代码>
结果应该是双倍的newAmount=1234.56
例2
多头金额=123456代码>
int-decimal=4代码>
结果应该是双倍新金额=12.3456
如果我理解正确,这就是您试图实现的目标:
Long amount = 123456;
int decimal = 2;
double newAmount = amount.doubleValue();
newAmount = newAmount / Math.pow(10, decimal);
使用的pow方法计算数字的幂
如果要使用其函数之一,请小心将变量声明为Long类型的对象,而不是基元类型
正如所建议的,从一开始就使用双变量而不是长变量更简单:
double amount = 123456;
int decimal = 2;
amount = amount / Math.pow(10, decimal);
您可以通过将给定的数字除以10^小数点来获得所需的数字,例如
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getNum(123456, 2));
System.out.println(getNum(123456, 4));
}
static double getNum(long val, int decimalPlaces) {
return val / Math.pow(10, decimalPlaces);
}
}
输出:
1234.56
12.3456
所有其他答案都建议转换为double
,然后在显示之前按10的幂进行缩放。由于缩放操作中的精度损失,这将导致一些意外结果。有关原因的完整、血淋淋的详细信息,请阅读
和
至于你的问题,你应该用BigDecimal
来做这项工作。从long
(或long
)转换为BigDecimal
不会失去精度,并且始终会产生预期的结果
BigDecimal甚至有一种方法可以为您进行缩放:
long amount = 123456;
int decimal = 2;
BigDecimal n = BigDecimal.valueOf(amount).scaleByPowerOfTen(-decimal);
输出:
1234.56
“结果应该是”-做什么的结果应该是1234.56Long
和Long
,如Integer
和int
只保存整数值;它们不使用小数位数,所以您如何处理“长数量”和“小数=2”来获得结果?长值是整数。小数点到哪里去了?你只需要除以/10^个小数位就可以了。不涉及格式。然后把这个长的数字变成一个双精度的数字,或者把股息声明为双精度的数字,或者你丢失了小数部分你的代码中的l
?它没有声明或设置在任何地方。@StephenP你是对的,这是一个打字错误,我错写了l
,因为我认为它是一个长变量。非常感谢。好的,您替换了l
——但是像amount这样的原始long
没有方法;它是一个原始的。你不能使用longvalue.doubleValue()
,你需要使用Long
对象,而不是原语。正如aran所说,你实际上可以在没有对象的情况下使用,即使你不能更改amount
或decimal
的声明类型,因为Math.pow
的返回类型是double
。如果你有像OP问题中那样的long amount
和int decimal
,你可以做:double newAmount=amount/java.lang.Math.pow(10,decimal)代码>@aron我添加了你的建议。我想使用OP的示例的初始变量,以提供更好的解释,以防他必须使用这些类型的变量。但是,我补充了你的改进,如果不是这样的话。