Tag: bigdecimal

丢失精度从java BigDecimal转换为double

我正在使用完全基于双精度的应用程序,并且在一个将字符串解析为double的实用程序方法中遇到问题。 我找到了一个修复,使用BigDecimal进行转换解决了这个问题,但是当我将BigDecimal转换回double时又引发了另一个问题:我失去了几个精度。 例如: import java.math.BigDecimal; import java.text.DecimalFormat; public class test { public static void main(String [] args){ String num = “299792.457999999984”; BigDecimal val = new BigDecimal(num); System.out.println(“big decimal: ” + val.toString()); DecimalFormat nf = new DecimalFormat(“#.0000000000”); System.out.println(“double: “+val.doubleValue()); System.out.println(“double formatted: “+nf.format(val.doubleValue())); } } 这会产生以下输出: $ java test big decimal: 299792.457999999984 double: 299792.458 double formatted: 299792.4580000000 […]

如何在ConcurrentHashMap线程安全的情况下更新BigDecimal

我正在制作一个应用程序,它需要一堆日记帐分录并计算总和。 当有多个线程调用addToSum()方法时,下面的方法是线程/并发安全。 我想确保每次通话都能正确更新总数。 如果不安全,请说明我必须做些什么来确保线程安全。 我需要synchronize get / put还是有更好的方法? private ConcurrentHashMap sumByAccount; public void addToSum(String account, BigDecimal amount){ BigDecimal newSum = sumByAccount.get(account).add(amount); sumByAccount.put(account, newSum); } 非常感谢! 更新: 谢谢大家的答案,我已经知道上面的代码不是线程安全的 。 感谢Vint建议将AtomicReference作为synchronize的替代方案。 我以前使用AtomicInteger来保存整数和,我想知道BigDecimal是否有类似的东西。 对两者的赞成和反对有明确的结论吗?

为什么BigDecimal自然排序与equals不一致?

从Javadoc for BigDecimal : 注意:如果BigDecimal对象用作SortedMap键或SortedSet元素,则应该小心,因为BigDecimal的自然顺序 与equals不一致 。 例如,如果您创建一个HashSet并向其添加new BigDecimal(“1.0”)和new BigDecimal(“1.00”) ,该集合将包含两个元素(因为这些值具有不同的比例,因此根据equals不equals和hashCode ),但是如果你使用TreeSet做同样的事情,那么该集合将只包含一个元素,因为当你使用compareTo时,这些值相等。 这种不一致背后有什么具体原因吗?

为什么Bigdecimal(双d)结构仍然存在?

我注意到这个构造函数有很大的痛苦(即使在这里Stack Overflow)。 人们使用它,即使文档明确指出: 这个构造函数的结果可能有点不可预测 http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double) 我甚至看到JSR-13获得批准并提出建议: 可能不推荐使用的现有规范:我们建议弃用BigDecimal(double)构造函数,该构造函数当前提供的结果与Double.toString()方法不同。 尽管如此,构造函数还没有被弃用。 我很想听听有关这方面的任何看法。

高效BigDecimal向上和向下舍入到小数点后两位

在java中我试图找到一种有效的方法将BigDecimal舍入到两个小数,根据条件向上或向下。 IF condition true then: 12.390 —> 12.39 12.391 —> 12.40 12.395 —> 12.40 12.399 —> 12.40 If condition false then: 12.390 —> 12.39 12.391 —> 12.39 12.395 —> 12.39 12.399 —> 12.39 实现这一目标的最有效方法是什么?

强制BigDecimals使用科学记数法

我有这个方法: public void Example(BigDecimal value, int scale){ BigDecimal x = new BigDecimal(“0.00001”); System.out.println(“result: ” + (value.multiply(x)).setScale(scale, RoudingMode.HALF_UP).toString()); 例如,如果value = 1且scale = 2,则输出为“result:0.00”。 我以为它会是1.00E-5。 所以,我的疑问是:如果BigDecimal的规模大于某个值(在我的例子中是2),我如何强制将BigDecimal格式化为科学记数法?

如何使用BigDecimal显示总是2个小数点的数字?

我使用BigDecimal来获得一些价格值。 需求是这样的,无论我们从数据库获取什么值,显示的值应该有2个小数点。 例如: 取值为1 – 应显示为1.00 取值为1.7823 – 应显示为1.78 我正在使用setScale(2, BigDecimal.ROUND_HALF_UP)但仍有一些地方,如果来自DB的数据是整数,则显示相同的!! 我的意思是如果DB的值为0,则仅显示为0。 我希望它显示为0.00 谢谢

如何在Hibernate中映射BigDecimal,以便恢复我放入的相同比例?

在Java中, new BigDecimal(“1.0”) != new BigDecimal(“1.00”)即规模很重要 。 但是,对于Hibernate / SQL Server来说,这显然不是这样。 如果我将BigDecimal上的比例设置为特定值,通过Hibernate将BigDecimal保存到数据库然后重新膨胀我的对象,我会返回一个具有不同比例的BigDecimal。 例如,值1.00将返回1.000000,我假设因为我们将BigDecimals映射到定义为NUMERIC(19,6)的列。 我不能只将列定义为所需的比例,因为我需要将Dollar和Yen值(例如)存储在同一列中。 为了外部报告工具的利益,我们需要将BigDecimals表示为数据库中的数字类型。 是否存在一个“正确”映射BigDecimal的Hibernate UserType,或者我是否必须自己编写?

Java BigDecimal删除小数和尾随数字

我是Java的新手并尝试使用BigDecimal(例如99999999.99)并将其转换为字符串但没有小数位和尾随数字。 另外,我不想要数字中的逗号,也不需要舍入。 我试过了: Math.Truncate(number) 但不支持BigDecimal。 有任何想法吗? 非常感谢。

将Locale特定String转换为BigDecimal的最佳方法

我必须将德语区域设置格式化的String转换为BigDecimal。 但是,我正在努力寻找最佳解决方案。 以下代码显示了我的问题: String numberString = “2.105,88”; NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN); try { Number parsed = nf.parse(numberString); BigDecimal bd1 = new BigDecimal(parsed.toString()); System.out.println(bd1.toString()); BigDecimal bd2 = new BigDecimal(parsed.doubleValue()); System.out.println(bd2); BigDecimal bd3 = new BigDecimal(numberString); System.out.println(bd3); } catch (ParseException e) { e.printStackTrace(); } 这个的出局是 2105.88 2105.8800000000001091393642127513885498046875 java.math.BigDecimal(java)中的线程“main”java.lang.NumberFormatException中的exception。在test.BigDecimalTest.main(BigDecimalTest.java:22)的java.math.BigDecimal。(未知来源) 第一个输出是正确的,但将String转换为Number (精确地为Double ),然后再将String转换为String然后转换为特定类型的Number , BigDecimal并没有多大意义。 第二个输出不正确,但可以通过设置BigDecimal的比例来解决。 但是,数字量并不总是已知。 第三个输出显然不是我想要的。 我的问题是,最好的方法是什么? […]