Java中模式为0.00的DecimalFormat怪异行为

Java中模式为0.00的DecimalFormat怪异行为,java,floating-point,format,decimalformat,Java,Floating Point,Format,Decimalformat,我使用下面的代码捕捉来显示带有两个小数点的float价格值 NumberFormat FORMAT = new DecimalFormat("#####0.00"); float myFloatValue =\\I am able to fetch this value dynamically String finalPrice = FORMAT.format(myFloatValue); // I am using this String (finalPrice) for export xml

我使用下面的代码捕捉来显示带有两个小数点的
float
价格值

NumberFormat FORMAT = new DecimalFormat("#####0.00");
float myFloatValue =\\I am able to fetch this value dynamically
String finalPrice = FORMAT.format(myFloatValue);
// I am using this String (finalPrice) for export xml purpose.
它似乎正常工作,但我注意到一些例子(如下所示),它工作不正常,产生的价格超过两个小数点。我无法再次复制它,我只能在日志文件中看到它

finalPrice
字符串的一些输出示例:0.109999660.18000030.4599998


有人能帮我从这些输出中猜出
myFloatValue
的原始值吗?因此,它将帮助我复制场景并修复它。

偶尔出现的情况让我想知道十进制格式是否在多个线程中同时使用。这是一个禁忌,不管人们怎么想 价值观也是错误的

也许为了更好的顺序,还需要指定一个固定的区域设置(小数点对逗号,千个分隔符)

最后,
float
甚至
double
都不适合金融软件:这些数字是近似值

BigDecimal price = new BigDecimal("9.99");
price = price.multiply(BigDecimal.TWO); // 19.98 exact

BigDecimal是一种用于编写计算的PITA,但保持其精度。

您的示例的输入是什么?这实际上是我的问题,我直接在日志中获取输出,无法复制,因此我需要输入浮点值。@VishalZanzrukia我以前的回答当时无效,对此表示抱歉。我无法复制这个问题,但是,如果有帮助的话,如果您没有注意到的话,在您描述的三种情况下,以下四位数字是0或9。是否存在格式化数字的条件(if/while/for),否则不会?我唯一想到的是
double
基本数据类型中众所周知的精度错误。但是
DecimalFormat
API保证只返回模板中指定的位数。您确定日志中的数据来自
DecimalFormat.format
返回的值吗?首先,您使用浮点数(double也不是解决方案)来建模价格。不要对十进制值(如货币)使用浮点,请始终使用BIGDECIMAL。浮动比翻倍更糟糕,因为如果价格超过1600万,您将丢失数字。第二,您的DecimalFormat似乎还可以,那么您使用的是什么JDK版本以及什么机器(Windows、Linux、Mac、Android?)