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 ^小数位来获得所需的数字,例如

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