Java 带指数的BigDecimal格式
我在Java(Android Studio)中格式化Java 带指数的BigDecimal格式,java,bigdecimal,exponential,largenumber,Java,Bigdecimal,Exponential,Largenumber,我在Java(Android Studio)中格式化BigDecimal时遇到问题 我想将BigDecimal格式化为String,当大于16个字符时,使用9位小数加上指数(0.000000000 e+00) 我使用了String#格式,但结果不正确,它是1.000000000e+32,而不是9.9999999e+31 我怎样才能得到正确格式的号码?这是代码 String b = "9999999999999999"; String c = "9999999999999999"; BigDeci
BigDecimal
时遇到问题
我想将BigDecimal
格式化为String
,当大于16个字符时,使用9位小数加上指数(0.000000000 e+00
)
我使用了String#格式
,但结果不正确,它是1.000000000e+32
,而不是9.9999999e+31
我怎样才能得到正确格式的号码?这是代码
String b = "9999999999999999";
String c = "9999999999999999";
BigDecimal resultMultyply = (new BigDecimal(b)).multiply(new BigDecimal(c));
String main_number = resultMultyply.toString();
if (main_number.length() > 16) {
// main_number = 99999999999999980000000000000001
main_number = String.format("%16.9e", new BigDecimal(main_number));
// main_number = 1.000000000e+32
}
main\u number
在格式化之前是正确的。使用DecimalFormat
和舍入模式DOWN
您的问题是,在创建输出值时,您没有掌握舍入模式。BigDecimal
的默认舍入模式是HALF\u UP
,这不是您想要的:您想要看到的是第一个数字。因此,这意味着您将丢弃预期精度之后的数字,这将转换为向下舍入
。不幸的是,BigDecimal
默认情况下不提供如此精细的粒度。因此,您必须使用DecimalFormat
总之,它是这样工作的:
import java.math.*;
import java.text.*;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("9999999999999999");
BigDecimal mul = a.multiply(a);
System.out.println(format(mul, 9));
}
private static String format(BigDecimal x, int scale) {
NumberFormat formatter = new DecimalFormat("0.0E0");
formatter.setRoundingMode(RoundingMode.DOWN);
formatter.setMinimumFractionDigits(scale);
return formatter.format(x);
}
}
产出:
9.999999999E31
您使用的是哪种语言?您发布的代码是JS吗?Javascript=/=java使用类似于big.JS的库或将数字视为字符串,因此您需要确保数字不会转换回数字。答案是Javascript,我已经意识到您粘贴的代码是Java.No。它是用Java编写的。我的错误!!它在Eclipse中工作,但在Android Studio中使用相同的代码,我得到了1.000000000 E32。@TonyKalo您在问题中根本没有指定Android Studio:这是Java原样,不是Android Studio风格的Java。您可能应该检查Android Studio是否有其他方法来实现这一点。但是我看到它与Java非常相似,所以实际上应该得到相同的结果,除非有bug?不过我会怀疑的。对不起,我是新来的。谢谢