长格式的小数点分隔符 (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 ArithmeticIs Floating Point Broken?

关于您的问题,您应该使用 BigDecimal 来完成工作。从 long(或 Long)转换为 BigDecimal 不会丢失精度,并且始终会产生预期的结果。

BigDecimal 甚至有一种方法可以为您进行缩放:

long amount = 123456;
int decimal = 2;
BigDecimal n = BigDecimal.valueOf(amount).scaleByPowerOfTen(-decimal);

输出:

1234.56