我正在使用完全基于双精度的应用程序,并且在一个将字符串解析为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()));
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
$ java test
big decimal: 299792.457999999984
double: 299792.458
double formatted: 299792.4580000000
Run Code Online (Sandbox Code Playgroud)
格式化的double表明它在第三位之后失去了精度(应用程序需要较低的精度位置).
如何让BigDecimal保留那些额外的精度位置?
谢谢!
追上这篇文章后更新.有人提到这超出了双数据类型的精度.除非我错误地阅读此引用:http: //java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 然后double原语的最大指数值为E max = 2 K-1 -1,标准实现K = 11.那么,最大指数应该是511,不是吗?
我的Java程序以高精度计算为中心,需要精确到至少120个小数位.
因此,所有非整数都将由程序中的BigDecimals表示.
显然,我需要为BigDecimals指定舍入的准确性,以避免无限的十进制表达式等.
目前,我发现必须在BigDecimal的每个实例化或数学运算中指定精度是一个巨大的麻烦.
有没有办法为所有BigDecimal计算设置"全局准确度"?
(比如python中Context.prec()的Decimal模块)
谢谢
规格:
Java jre7 SE
Windows 7(32)
我正在尝试验证大小数的精度和比例.
我希望验证一个大小数不超过10的精度或2的标度.我尝试做一个maxlength所以该值不会违反我的数据库长度限制,但也无法使其工作.有人可以指点我解决这个问题的方向吗?
我正在使用休眠.它的id列有20个精度,如下所示,但是NUMBER类型.
NUMBER(38,20) - 这是表(id数据库)的id列的大小.
此ID由我们的应用程序生成.在实体中如果我使用Float或Double它不能容纳20个精度.但java.math.BigDecimal可以容纳这些许多精度.但问题是我可以在hbm中使用BigDecimal,如下所示?会有什么问题吗?有时我可能不会发送精确的id.那个时候会休眠生成任何空的精度和插入?
<id name="someId" column="SOME_ID" type="java.math.BigDecimal"/>
Run Code Online (Sandbox Code Playgroud)
请指教!
我有一个BigDecimal变量
BigDecimal x = new BigDecimal("5521.0000000001");
Run Code Online (Sandbox Code Playgroud)
式:
x = x.add(new BigDecimal("-1")
.multiply(x.divideToIntegralValue(new BigDecimal("1.0"))));
Run Code Online (Sandbox Code Playgroud)
我想删除整数部分,以获取值x = ("0.0000000001"),但我的新值是1E-10而不是0.0000000001.
类BigDecimal有一些有用的方法来保证无损转换:
byteValueExact()shortValueExact()intValueExact()longValueExact()但是,方法floatValueExact()和doubleValueExact()不存在。
我阅读了 OpenJDK 源代码的方法floatValue()和doubleValue(). 两者似乎分别回退到Float.parseFloat()和Double.parseDouble(),这可能返回正无穷大或负无穷大。例如,解析 10,000 个 9 的字符串将返回正无穷大。据我了解,BigDecimal内部没有无穷大的概念。此外,将 100 个 9 的字符串解析为double给出1.0E100,这不是无穷大,但会失去精度。
什么是一个合理的实现floatValueExact()和doubleValueExact()?
我想到了一个double解决方案相结合BigDecimal.doubleValue(),BigDecial.toString(),Double.parseDouble(String)和Double.toString(double),但它看起来凌乱。我想在这里问,因为可能(必须!)有一个更简单的解决方案。
需要明确的是,我不需要高性能解决方案。
在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
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最有效方法是什么?
哪一个是比较Java中BigDecimal和int的最佳方法:将BigDecimal转换为int或将int转换为BigDecimal?
BigDecimal的equals()方法也比较比例,所以
new BigDecimal("0.2").equals(new BigDecimal("0.20")) // false
Run Code Online (Sandbox Code Playgroud)
有人质疑它为何如此行事.
现在,假设我有一个Set<BigDecimal>,如何检查0.2是否在该集合中,是否独立?
Set<BigDecimal> set = new HashSet<>();
set.add(new BigDecimal("0.20"));
...
if (set.contains(new BigDecimal("0.2")) { // Returns false, but should return true
...
}
Run Code Online (Sandbox Code Playgroud) bigdecimal ×10
java ×10
rounding ×2
comparison ×1
double ×1
hibernate ×1
int ×1
math ×1
precision ×1
primary-key ×1