标签: bigdecimal

Java BigDecimal删除小数和尾随数字

我是Java的新手并尝试使用BigDecimal(例如99999999.99)并将其转换为字符串但没有小数位和尾随数字.另外,我不想要数字中的逗号,也不需要舍入.

我试过了:

Math.Truncate(number)
Run Code Online (Sandbox Code Playgroud)

但不支持BigDecimal.

有任何想法吗?

非常感谢.

java decimal bigdecimal

18
推荐指数
4
解决办法
5万
查看次数

将BigDecimal舍入到最接近的5美分

我想弄清楚如何将货币金额向上舍入到最接近的5美分.以下显示了我的预期结果

1.03     => 1.05
1.051    => 1.10
1.05     => 1.05
1.900001 => 1.10
Run Code Online (Sandbox Code Playgroud)

我需要结果的精度为2(如上所示).

更新

按照下面的建议,我能做的最好的就是这个

    BigDecimal amount = new BigDecimal(990.49)

    // To round to the nearest .05, multiply by 20, round to the nearest integer, then divide by 20
   def result =  new BigDecimal(Math.ceil(amount.doubleValue() * 20) / 20)
   result.setScale(2, RoundingMode.HALF_UP)
Run Code Online (Sandbox Code Playgroud)

我不相信这是100%犹太人 - 我担心转换到双打时精度可能会丢失.然而,这是迄今为止我提出的最好的,似乎有效.

java rounding bigdecimal

18
推荐指数
4
解决办法
2万
查看次数

是否存在与Java的BigDecimal等效的C++?

我正在寻找一个可以进行十进制浮点运算的C++类.通过http://speleotrove.com/decimal/查看,可以找到人们编写和未维护的各种类的链接.挖掘decNumber ++的东西让我看到一些电子邮件,表明GCC最终会支持这个功能.(正式名称为ISO/IEC TR 24733)

我正在寻找一些我可以用作浮动或双重替代品的东西,这是其他人在他们自己的项目中使用的东西.希望开源.

谢谢!

编辑:我应该指出,我正在尝试使用它来代表价格.所以我需要精确的小数,而不是巨大的小数.

c++ bigdecimal

18
推荐指数
3
解决办法
2万
查看次数

为什么新的BigDecimal("0.0").stripTrailingZeros()的比例为1?

运行这个简单的程序:

public static void main(final String... args)
{
    System.out.println(BigDecimal.ZERO.scale());
    System.out.println(new BigDecimal("0").scale());
    System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale());
    System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale());
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
0
1
0
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:为什么不是第三个println输出0?那似乎合乎逻辑......

编辑:好的,所以,这是一个非常古老的错误:

错误链接

事实上,它"适用于"任意数量的零:new BigDecimal("0.0000").stripTrailingZeroes().scale()是4!

java bigdecimal

17
推荐指数
1
解决办法
6844
查看次数

将BigDecimal向上舍入为整数值

我有一个BigDecimal,其值为450.90,我想要向上舍入到下一个空洞整数值,然后打印没有任何小数点的整数值,就像这样;

Val:450.90 - > Rounded:451.00 - >输出:451

Val:100.00001 - > Rounded:101.00000产量:101

检查了一些解决方案,但我没有得到预期的结果,继承我的代码;

BigDecimal value = new BigDecimal(450.90);
value.setScale(0, RoundingMode.HALF_UP); //Also tried with RoundingMode.UP
return value.intValue();
Run Code Online (Sandbox Code Playgroud)

谢谢!

java math rounding bigdecimal

17
推荐指数
2
解决办法
3万
查看次数

可以加倍还是BigDecimal溢出?

Java 8为我们提供了Math.addExact(),但不是小数.

是否有可能doubleBigDecimal溢出?通过Double.MAX_VALUE如何获得最大的BigDecimal值判断我会说答案是肯定的.

因此,为什么我们不也Math.addExact()为这些类型?什么是最可维护的方式来检查这个?

java double integer-overflow bigdecimal

17
推荐指数
2
解决办法
5117
查看次数

使用decimal将Java转换为BigDecimal - Java

我很难搞清楚如何转换它.这就是我想要的:

int i = 5900;

BigDecimal bD = new BigDecimal(i);
Run Code Online (Sandbox Code Playgroud)

我需要bD为59.00,但我无法弄清楚如何得到这个结果.所有我能得到的是5900作为BigDecimal类型.任何建议都会有所帮助,谢谢.

java type-conversion bigdecimal

17
推荐指数
1
解决办法
6万
查看次数

"新BigDecimal(13.3D)"导致不精确的"13.3000000000000007105 .."?

Java是如何BigDecimal痛苦的?

Double d = 13.3D;

BigDecimal bd1 = new BigDecimal(d);
BigDecimal bd2 = new BigDecimal(String.valueOf(d));


System.out.println("RESULT 1: "+bd1.toString());
System.out.println("RESULT 2: "+bd2.toString());

RESULT 1: 13.300000000000000710542735760100185871124267578125
RESULT 2: 13.3
Run Code Online (Sandbox Code Playgroud)

是否存在需要结果1的情况?我知道Java 1.5改变了toString()方法,但这是预期的后果吗?

我也意识到BigDecimaldoubleValue()等等,但我正在使用的库有用地使用了一个toString(),我无法改变:-(

干杯.

java precision bigdecimal

16
推荐指数
4
解决办法
4587
查看次数

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

我正在制作一个应用程序,它需要一堆日记帐分录并计算总和.

当有多个线程调用该addToSum()方法时,下面的方法是线程/并发安全.我想确保每次通话都能正确更新总数.

如果不安全,请说明我必须做些什么来确保螺纹安全.

我需要synchronize获取/放置还是有更好的方法?

private ConcurrentHashMap<String, BigDecimal> sumByAccount;

public void addToSum(String account, BigDecimal amount){
    BigDecimal newSum = sumByAccount.get(account).add(amount);
    sumByAccount.put(account, newSum);
}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

更新:

谢谢大家的答案,我已经知道上面的代码不是线程安全的.

感谢Vint建议AtomicReference作为替代品synchronize.之前我AtomicInteger用来保存整数和,我想知道BigDecimal是否有类似的东西.

关于两者的赞成和反对,这是一个明确的结论吗?

java concurrency thread-safety bigdecimal concurrent-collections

16
推荐指数
1
解决办法
6038
查看次数

创建自定义BigDecimal类型

在我的应用程序中,所有BigDecimal数字都缩放为两位小数.换句话说,每次我在代码中创建一个新的BigDecimal时,我也需要使用方法比例:

BigDecimal x = BigDecimal.ZERO;
x.setScale(2, RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)

因此,为了最大限度地减少工作量,我想创建自定义BigDecimal类型,例如:

public class CustomBigDecimal extends BigDecimal {

    public CustomBigDecimal(String val) {
        super(val);
        this.setScale(2, RoundingMode.HALF_UP);
    }

}
Run Code Online (Sandbox Code Playgroud)

我知道this.setScale(2, RoundingMode.HALF_UP);不做这项工作,但我找不到办法,是否有可能?

java bigdecimal

16
推荐指数
3
解决办法
2343
查看次数