标签: bigdecimal

BigDecimal("0")和BigDecimal.ZERO之间有区别吗?

无论是对于新变量的比较还是初始化,它是否会影响您使用哪一个?

我知道BigDecimal.ZERO是一个1.5特性,所以这是一个问题,但假设我使用1.5是否重要?

谢谢.

java bigdecimal zero

26
推荐指数
2
解决办法
5万
查看次数

将小数提高到十进制的幂?

.net框架在Math类中提供了一个为double提供动力的方法.但是根据精度要求,我需要将小数提高到十进制幂[Pow(十进制a,十进制b)].框架是否具有这样的功能?有没有人知道有这种功能的图书馆?

c# decimal bigdecimal

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

为什么BigDecimal自然排序与equals不一致?

来自JavadocBigDecimal:

注:如果应谨慎BigDecimal对象作为一个键SortedMap或元素的SortedSetBigDecimal自然顺序与等号一致.

例如,如果你创建HashSet并添加new BigDecimal("1.0")new BigDecimal("1.00")它的集将包含两个元素(因为该值有不同的尺度,所以是不相等的根据equalshashCode),但如果你有做同样的事情TreeSet,该Set只包含一个元素,因为使用时值比较相等compareTo.

这种不一致背后有什么具体原因吗?

java bigdecimal

25
推荐指数
1
解决办法
1766
查看次数

如何在Java中对BigDecimal进行分数处理?

在我的小项目中,我需要做一些像Math.pow(7777.66,5555.44)这样的东西只有非常大的数字.我遇到了一些解决方案:

  • 使用双倍 - 但数字太大
  • 使用BigDecimal.pow但不支持小数
  • 使用X ^(A + B)= X ^ A*X ^ B公式(B是第二个数字的余数),但是再次不支持大X或大A,因为我仍然转换为double
  • 使用某种泰勒级数算法或类似的东西 - 我不是很擅长数学,所以如果我找不到任何解决方案(一些库或(A + B)的公式^(C),这个是我的最后一个选项+ d)).

有人知道图书馆或简单的解决方案吗?我想很多人都处理同样的问题......

ps我发现了一些名为ApFloat的图书馆声称要做大约,但我得到的结果是如此近似,甚至8 ^ 2给了我60 ...

java formula bigdecimal pow

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

确定String是否为数字并使用Java进行转换?

我知道这个问题的变种频繁之前(见已被要求在这里这里的实例),但是这不是一个确切的重复.

我想检查a String是否是数字,如果是,我想将其存储为double.有几种方法可以做到这一点,但所有这些方法似乎都不适合我的目的.

一种解决方案是使用Double.parseDouble(s)或类似new BigDecimal(s).但是,如果存在逗号,则这些解决方案不起作用(因此"1,234"会导致异常).我当然可以使用这些技术之前去掉所有的逗号,但这似乎不会造成在其他语言环境的问题负载.

我查看了Apache Commons NumberUtils.isNumber(s),但是它遇到了同样的逗号问题.

我认为NumberFormat还是DecimalFormat,但这些似乎过于宽松.例如,"1A"被格式化为"1"而不是表示它不是数字.此外,像"127.0.0.1"这样的东西将被计为数字127而不是表示它不是数字.

我觉得我的要求不是那么奇特,我是第一个这样做,但没有一个解决方案完全符合我的要求.我想即使我不确切知道我需要什么(否则我可以编写自己的解析器),但我知道上述解决方案因指示的原因不起作用.是否存在任何解决方案,或者我是否需要准确弄清楚我需要什么并为其编写自己的代码?

java numbers bigdecimal string-parsing

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

什么导致BigDecimal.divide的"非终止十进制扩展"异常?

我之前使用过BigDecimals但不经常使用BigDecimals,今天早上我正在处理一些事情并且我一直遇到以下异常:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;
no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1594)
Run Code Online (Sandbox Code Playgroud)

我试图设置比例并使用舍入来消除这样的问题:

    BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd3 = bd1.divide(bd2).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("result: " + bd3);
Run Code Online (Sandbox Code Playgroud)

但是,我一直得到同样的例外.有谁能告诉我我犯了哪个错误?

java exception bigdecimal

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

在Java中将double转换为BigDecimal

我写了一个Java程序来计算Riemann Zeta函数的值.在程序内部,我创建了一个库来计算必要的复杂函数,如atan,cos等.两个程序中的所有内容都通过doubleBigDecimal数据类型访问.这在评估Zeta函数的大值时会产生重大问题.

Zeta函数参考的数值近似

s具有较大复杂形式的情况下,以高值直接评估此近似会产生问题,例如s = (230+30i).我非常感谢在这里获得有关这方面的信息.S2.minus(S1)由于我在adaptiveQuad方法中写错了,因此创建错误的评估.

例如,Zeta(2+3i)通过这个程序生成

Calculation of the Riemann Zeta Function in the form Zeta(s) = a + ib.

Enter the value of [a] inside the Riemann Zeta Function: 2
Enter the value of [b] inside the Riemann Zeta Function: 3
The value for Zeta(s) is 7.980219851133409E-1 - 1.137443081631288E-1*i
Total time taken is 0.469 seconds.
Run Code Online (Sandbox Code Playgroud)

这是正确的. …

java double bigdecimal complex-numbers

24
推荐指数
2
解决办法
2556
查看次数

如何在java中将带有美元符号的字符串数值转换为BigDecimal?

我有一个String格式的美元金额.例如:String salePrice = $ 348.00.

但是,我想将此String值转换为BigDecimal值,但它在字符串中有一个美元符号.我尝试了下面的代码,但它无法正常工作.

BigDecimal sPrice = new BigDecimal(salePrice);
Run Code Online (Sandbox Code Playgroud)

我最终得到以下这个例外:

java.lang.NumberFormatException
    at java.math.BigDecimal.<init>(Unknown Source)
    at java.math.BigDecimal.<init>(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

java string bigdecimal

23
推荐指数
2
解决办法
8万
查看次数

Rails NoMethodError:BigDecimal:Class 的未定义新方法

我的应用程序在:

ruby-2.6.4 Rails 4.2.8 activerecord-4.2.8

我升级Rails应用程序,以ruby-2.6.4 当运行在开发rake任务,进行测试,我对收到错误BigDecimal().../vendor/bundle/ruby/2.6.0/gems/ruby-oci8/...

ArgumentError: invalid value for BigDecimal(): "0.E+00"
/sha/git/sha_human_resources/shared/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/bindtype.rb:35:in `BigDecimal'
...
.../vendor/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/bindtype.rb:216: warning: constant ::Fixnum is deprecated
.../vendor/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/bindtype.rb:219: warning: constant ::Bignum is deprecated
.../vendor/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/compat.rb:73: warning: constant ::Fixnum is deprecated
Run Code Online (Sandbox Code Playgroud)

我找到了几个关于更新bigdecimaloci8gems 的线程,所以尝试了几个版本,发现这些有帮助git diff Gemfile::

-gem 'ruby-oci8', '~> 2.1.5'
+gem 'ruby-oci8', '~> 2.2.8'
Run Code Online (Sandbox Code Playgroud)

并添加了一个 bigdecimal gem:

+gem "bigdecimal", ">= 2.0.0"
Run Code Online (Sandbox Code Playgroud)

现在,当我运行 rake 任务时,出现此错误:

rake aborted!
NoMethodError: undefined method `new' for BigDecimal:Class
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object/duplicable.rb:111:in `<class:BigDecimal>'
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object/duplicable.rb:106:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object.rb:3:in …
Run Code Online (Sandbox Code Playgroud)

oracle-call-interface bigdecimal ruby-on-rails-4

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

如何使用Streams平均BigDecimals?

我想采取以下方法:

public BigDecimal mean(List<BigDecimal> bigDecimals, RoundingMode roundingMode) {
    BigDecimal sum = BigDecimal.ZERO;
    int count=0;
    for(BigDecimal bigDecimal : bigDecimals) {
        if(null != bigDecimal) {
            sum = sum.add(bigDecimal);
            count++;
        }
    }
    return sum.divide(new BigDecimal(count), roundingMode);
}
Run Code Online (Sandbox Code Playgroud)

并使用Streams api更新它.这是我到目前为止所得到的:

public BigDecimal average(List<BigDecimal> bigDecimals, RoundingMode roundingMode) {
    BigDecimal sum = bigDecimals.stream()
        .map(Objects::requireNonNull)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
    long count = bigDecimals.stream().filter(Objects::nonNull).count();
    return sum.divide(new BigDecimal(count), roundingMode);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有两次流式传输的情况下做到这一点(第二次获得计数)?

java collections bigdecimal java-8 java-stream

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