Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长格式小数分隔符(Java/Spring)_Java_Spring Boot_Numberformatter - Fatal编程技术网

长格式小数分隔符(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.56
Long
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的示例的初始变量,以提供更好的解释,以防他必须使用这些类型的变量。但是,我补充了你的改进,如果不是这样的话。