长格式的小数点分隔符 (Java/Spring)
Decimal separator in long (Java/Spring)
我需要将小数点分隔符放在 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 ^ decimalPlaces 例如
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
我需要将小数点分隔符放在 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 ^ decimalPlaces 例如
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