我正在尝试使用两个十进制值(如果可能)打印纯文本中的浮点值。例如,如果我在数据库中有229806210.039999,那么我想将其打印为229806210.04,但由于某种原因它以科学记数法打印出来:2.29806208E8,这是不正确的,因为最后两位数是08而不是10我尝试将数字转换为双倍和货币格式,然后将其打印出来,但数字仍然是关闭的(最后两位数字为08而不是10)。有没有办法解决这个问题?这就是我现在所拥有的:
float amount = 0;
amount = something.getAmount() //this will run the query
//to retrieve the amount stored in database (i.e. 229806210.039999)
Stringbuilder buffer = new StringBuilder();
buffer.append ("the amount = " + amount)
emailObject.setBody(buffer.toString());
emailService.sendEmail(emailObject);
答案 0 :(得分:2)
这看起来像Java,所以请看DecimalFormat。很好地记录了如何格式化数字。
答案 1 :(得分:2)
您应该使用DecimalFormat。 它需要一个具有所需格式的参数并返回格式化程序
文档可用here。
Double number = 1144.034;
DecimalFormat format = new DecimalFormat("0.00");
System.out.println(format.format(price));
输出
1144.03
答案 2 :(得分:1)
DecimalFormat给出(有时不需要的)区域设置小数点(“。”vs.,“,”) 最近我换了
double x= ...;
String formatted = String.format(Locale.US, "%.2d", x);
更方便,(C风格格式符号)
答案 3 :(得分:0)
浮点数的精度有限,大约为7到8位十进制数。一旦您将值存储在浮点数中,无论您如何处理它,都不能指望更高的数字。
答案 4 :(得分:0)
浮点数用于近似计算,具有固定的有效位数。也就是说,float
只存储数字的指数,以及数字的前24个二进制数字(大约7个十进制数字)。由于您的号码超过7位数,因此舍入将删除剩余的数字。
至少,您需要使用double
来保存该号码。对于16个有效十进制数字,它至少可以表示该数量的数字的0.01的差异。但是,计算仍然只是近似值。
如果您需要精确的表示和计算,请改用BigDecimal
。
最后,要格式化数字,请使用NumberFormat。 Java Tutorial很好地解释了这一点。
答案 5 :(得分:0)
我尝试在打印之前将数字转换为double和货币格式,但数字仍然是关闭的(最后两位数字为08而不是10)。有没有办法解决这个问题?
事实为时已晚,将其投入双倍,信息已丢失。
您必须在值可能已经传递的位置使用双精度,即64位浮点数(或者对于数据库,您可以使用固定精度)
float
不是数量(或大多数事情)的最佳格式我建议使用double(或BigDecimal或长固定精度)
而不是
Stringbuilder buffer = new StringBuilder();
buffer.append ("the amount = " + amount)
emailObject.setBody(buffer.toString());
你可以写
emailObject.setBody(String.format("the amount = %.2f%n" , amount));
拥有至少一个换行符可能是“礼貌的”。 ;)