标签: bigdecimal

Java 中 BigDecimal 和 double 的运算

我试图在 java 程序中使用 Advogadro 的数字 (6.022*10^23),我使用 BigDecimal 变量来存储它。但是我想将它与 int 或 double 相乘并仍然保持精度,但它会引发错误!

bad operand types for binary operator '*'
  first type:  double
  second type: BigDecimal
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以做到这一点?还有一种方法可以用科学记数法打印结果吗?

提前致谢!

java variables double bigdecimal

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

使用 BigDecimal 将比例设置为负数

像这样将比例设置为负数是否有意义?

BigDecimal result;
    .
    .
    .
result = result.setScale(-1, RoundingMode.HALF_UP)
Run Code Online (Sandbox Code Playgroud)

如果你这样做会发生什么?

java bigdecimal

0
推荐指数
1
解决办法
5160
查看次数

如何在 Java 中为 BigDecimal 设置特定精度?

我有 BigDecimal 值。

BigDecimal price = new BigDecimal("100500100500.9999999").setScale(2, BigDecimal.ROUND_HALF_EVEN);
Run Code Online (Sandbox Code Playgroud)

它打印100500100501.00,虽然我需要100500100500.99. 是否可以对精确评估进行一些限制?

java bigdecimal

0
推荐指数
1
解决办法
3822
查看次数

不能在 BigDecimal 变量中放入双精度数

我正在使用一个保存商品价格的 Double 变量。该变量存储在 postgresql 数据库中的货币类型列下。我使用 setBigDecimal(position,value) SQL 函数。在其他部分,我使用 JSpinner 作为输入。

Double current = 0.0;
Double min = (double) Integer.MIN_VALUE;
Double max = (double) Integer.MAX_VALUE;
Double step = 0.1;

JSpinner priceSpinner = new JSpinner(new SpinnerNumberModel(current, min, max, step));
Run Code Online (Sandbox Code Playgroud)

当用户单击按钮时,我会获取用户输入的值并通过 SQL 查询将其放入数据库中。

 insertStmt.setBigDecimal(position,BigDecimal.valueOf((double) priceSpinner.getValue()));
Run Code Online (Sandbox Code Playgroud)

但是,我得到了这个小错误,

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Double
Run Code Online (Sandbox Code Playgroud)

java double bigdecimal jspinner classcastexception

0
推荐指数
1
解决办法
3万
查看次数

BigDecimal.Divide 给出不正确的结果

使用 BigDecimal 执行除法时得到不正确的结果。number1 = 221500.0 number2 = 12.0 这是我的代码片段:

BigDecimal d1 = new BigDecimal(String.valueOf(number1)).setScale(13, 4);
BigDecimal d2 = new BigDecimal(String.valueOf(number2)).setScale(13, 4);
return (d1.divide(d2, 13, 4 )).doubleValue();
Run Code Online (Sandbox Code Playgroud)

18458.333333333332

如果我使用计算器执行相同的计算,它会给出 18458.333333333333333333333333333

如果在处理 BigDecimal 中的比例时遇到任何问题,请告诉我。如果有人让我知道如何用计算器得出相同的结果,那将会很有帮助。

java math bigdecimal

0
推荐指数
1
解决办法
2731
查看次数

Java BigDecimal数据转换为相反的符号

根据Java 7 文档,类java.math.BigDecimal中的方法longValue可以返回符号相反的结果.

将此BigDecimal转换为long.这种转换类似于Java™语言规范第5.1.3节中定义的从double到short的缩小原语转换:此BigDecimal的任何小数部分都将被丢弃,如果生成的"BigInteger"太大而无法容纳很长,只返回低位64位.请注意,此转换可能会丢失有关此BigDecimal值的整体大小和精度的信息,并返回具有相反符号的结果.

在什么情况下可能?

java precision type-conversion truncation bigdecimal

0
推荐指数
1
解决办法
1350
查看次数

在Java中获得两个BigDecimal值中较小者的最简单方法

有什么方法可以确定两个BigDecimal对象中的哪一个是比(if三元运算符)调用更简单的数字(更小)BigDecimal::compareTo

鉴于:

BigDecimal x = … ;
BigDecimal y = … ;
Run Code Online (Sandbox Code Playgroud)

要么:

if( x.compareTo( y ) < 0 ) {
    return x ;
} else {
    return y ;
} 
Run Code Online (Sandbox Code Playgroud)

要么:

BigDecimal lower = ( x.compareTo( y ) < 0 ) ? x : y ;  // If x is smaller than y, use x. If x is greater than or equal to y, use y. 
Run Code Online (Sandbox Code Playgroud)

java bigdecimal compareto

0
推荐指数
2
解决办法
845
查看次数

java中的大数模数

我正在用 java 编写一个 RSA 解密原型。这只是为了展示它对学校的作用,这就是为什么我尽量保持简单。但是当我进入解密部分时,我必须使用公式:

c = m^e % n。

出于测试目的,我尝试使用m = "1010"(因为我从我的程序中将它作为字符串获取)、e = 55n = 361来做到这一点。这应该给我 345 作为 c(在 Windows 计算器中测试)。我得到的结果是:

Math.pow(Integer.parseInt("1010"), 55) % 361 // 115.0

BigDecimal b = BigDecimal.valueOf(Math.pow(Integer.parseInt("1010"),55));

(b.remainder(BigDecimal.valueOf(361))).doubleValue() // 300.0

Math.pow(Integer.parseInt("1010"), 55) % 361 //  340
Run Code Online (Sandbox Code Playgroud)

请告诉我我错在哪里或如何解决这个问题。提前致谢。

java integer algebra bigdecimal modulus

0
推荐指数
1
解决办法
754
查看次数

Scala BigDecimal - 精度损失

我需要用大数字做一些精确计算,我一直在尝试使用 Scala,BigDecimal但我注意到精度损失。

举个例子:

2^63 == 9223372036854775808
2^64 == 18446744073709551616
Run Code Online (Sandbox Code Playgroud)

但是当我做

println(BigDecimal.decimal(scala.math.pow(2, 63)).toBigIntExact())
println(BigDecimal.decimal(scala.math.pow(2, 64)).toBigIntExact())
Run Code Online (Sandbox Code Playgroud)

我得到

9223372036854776000 != 9223372036854775808
18446744073709552000 != 18446744073709551616 
Run Code Online (Sandbox Code Playgroud)

我不知道如果我能得到确切的BigInt

也许我必须采取其他方法。

有人可以帮我解决这个问题吗?

math precision scala bigdecimal bigint

0
推荐指数
1
解决办法
50
查看次数

为什么在使用 RoundingMode 时 java BigDecimal 除法结果与 Double 除法不同

我一直在研究用 编写的公差计算代码Double,有精度和舍入问题我决定继续BigDecimal考虑它更精确并且不太可能遇到舍入问题。在计算中,一段代码在分割值时使用Math.floor()Math.Ceil

奇怪的观察结果,ROUNDING_MODE.floor并且ceil在使用 时实际上并不适用BigDecimal,这是最小的可重现示例。

Double doubleFloor = Math.floor(5.5/1.0);
Double doubleCeil = Math.ceil(5.5/1.0);
System.out.println(doubleFloor);
System.out.println(doubleCeil);  
    
BigDecimal bigDecimalFloor = BigDecimal.valueOf(5.5).divide(BigDecimal.ONE,1,RoundingMode.FLOOR);
BigDecimal bigDecimalCeil = BigDecimal.valueOf(5.5).divide(BigDecimal.ONE,1,RoundingMode.CEILING);
System.out.println(bigDecimalFloor);
System.out.println(bigDecimalCeil);

Run Code Online (Sandbox Code Playgroud)

我希望为这么小的除法打印相同的值,但是我得到以下结果,floor 和 ceil 似乎没有按预期计算。

5.0
6.0
5.5
5.5
Run Code Online (Sandbox Code Playgroud)

我错过了什么。?

先感谢您

java bigdecimal floor ceil

0
推荐指数
1
解决办法
80
查看次数