问题描述
我需要将小数点分隔符放在 Long 中,我尝试了多种方法,但我需要它是动态的,因为小数点分隔符可以更改,我尝试使用 DecimalFormat format = new DecimalFormat("###.##");
但这不是动态的它没有按照我想要的方式工作
示例 1
long amount = 123456;
int decimal = 2;
结果应该是 Double newAmount = 1234.56
示例 2
long amount = 123456;
int decimal = 4;
结果应该是 Double newAmount = 12.3456
解决方法
如果我理解正确,这就是您要实现的目标:
Long amount = 123456;
int decimal = 2;
double newAmount = amount.doubleValue();
newAmount = newAmount / Math.pow(10,decimal);
使用 java.lang.math 的 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 的幂进行缩放。由于缩放操作的精度损失,这将导致一些意想不到的结果。有关原因的完整、血腥的详细信息,请阅读
What Every Computer Scientist Should Know About Floating-Point Arithmetic 和
Is Floating Point Broken?
至于您的问题,您应该使用 BigDecimal
来完成这项工作。从 long
(或 Long
)转换为 BigDecimal
不会损失精度,并且总是会产生预期的结果。
BigDecimal 甚至有一种方法可以为您进行缩放:
long amount = 123456;
int decimal = 2;
BigDecimal n = BigDecimal.valueOf(amount).scaleByPowerOfTen(-decimal);
输出:
1234.56