我试图在 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)
有没有简单的方法可以做到这一点?还有一种方法可以用科学记数法打印结果吗?
提前致谢!
像这样将比例设置为负数是否有意义?
BigDecimal result;
.
.
.
result = result.setScale(-1, RoundingMode.HALF_UP)
Run Code Online (Sandbox Code Playgroud)
如果你这样做会发生什么?
我有 BigDecimal 值。
BigDecimal price = new BigDecimal("100500100500.9999999").setScale(2, BigDecimal.ROUND_HALF_EVEN);
Run Code Online (Sandbox Code Playgroud)
它打印100500100501.00,虽然我需要100500100500.99. 是否可以对精确评估进行一些限制?
我正在使用一个保存商品价格的 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) 使用 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 7 文档,类java.math.BigDecimal中的方法longValue可以返回符号相反的结果.
将此BigDecimal转换为long.这种转换类似于Java™语言规范第5.1.3节中定义的从double到short的缩小原语转换:此BigDecimal的任何小数部分都将被丢弃,如果生成的"BigInteger"太大而无法容纳很长,只返回低位64位.请注意,此转换可能会丢失有关此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 编写一个 RSA 解密原型。这只是为了展示它对学校的作用,这就是为什么我尽量保持简单。但是当我进入解密部分时,我必须使用公式:
c = m^e % n。
出于测试目的,我尝试使用m = "1010"(因为我从我的程序中将它作为字符串获取)、e = 55、n = 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)
请告诉我我错在哪里或如何解决这个问题。提前致谢。
我需要用大数字做一些精确计算,我一直在尝试使用 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。
也许我必须采取其他方法。
有人可以帮我解决这个问题吗?
我一直在研究用 编写的公差计算代码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)
我错过了什么。?
先感谢您