标签: bigdecimal

使用BigDecimal的小数点后的最大位数

BigDecimalJava中值的小数点后我们可以拥有的最大位数是多少?

java bigdecimal

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

丢失精度从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()));
    }
}
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 floating-point precision double bigdecimal

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

将所有BigDecimal操作设置为一定的精度?

我的Java程序以高精度计算为中心,需要精确到至少120个小数位.
因此,所有非整数都将由程序中的BigDecimals表示.

显然,我需要为BigDecimals指定舍入的准确性,以避免无限的十进制表达式等.
目前,我发现必须在BigDecimal的每个实例化或数学运算中指定精度是一个巨大的麻烦.

有没有办法为所有BigDecimal计算设置"全局准确度"?
(比如python中Context.prec()Decimal模块)

谢谢


规格:
Java jre7 SE
Windows 7(32)

java math rounding floating-accuracy bigdecimal

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

如何使用BigDecimal验证精度和比例?

我正在尝试验证大小数的精度和比例.

我希望验证一个大小数不超过10的精度或2的标度.我尝试做一个maxlength所以该值不会违反我的数据库长度限制,但也无法使其工作.有人可以指点我解决这个问题的方向吗?

java bigdecimal

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

我可以在hibernate hbm中使用BigDecimal作为id类型吗?

我正在使用休眠.它的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)

请指教!

java hibernate primary-key bigdecimal

11
推荐指数
1
解决办法
4076
查看次数

没有E的Java BigDecimal

我有一个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.

java bigdecimal

11
推荐指数
1
解决办法
7656
查看次数

如何知道 BigDecimal 是否可以准确转换为浮点数或双精度数?

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

11
推荐指数
1
解决办法
958
查看次数

高效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
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最有效方法是什么?

java rounding bigdecimal

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

在Java中比较BigDecimal和int

哪一个是比较Java中BigDecimal和int的最佳方法:将BigDecimal转换为int或将int转换为BigDecimal?

java int comparison bigdecimal

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

如何以与比例无关的方式检查BigDecimal是否在Set或Map中?

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)

java bigdecimal

10
推荐指数
1
解决办法
1844
查看次数