标签: bigdecimal

最好的跨平台(便携式)任意精度数学库

我在C或C++中寻找一个好的任意精度数学库.你能给我一些意见/建议吗?

主要要求:

  1. 必须处理任意大整数(我的主要兴趣是整数).如果你不知道这个词是什么意思大,意味着像100000这样的东西!(阶乘为100000).
  2. 在库初始化/对象创建期间,不必指定精度.精度应该受系统可用资源的限制.
  3. 应该利用平台的全部功能,并且应该本地处理"小"数字.这意味着在64位平台上,计算2 ^ 33 + 2 ^ 32应该使用可用的64位CPU指令.库不应该像在同一平台上使用2 ^ 66 + 2 ^ 65那样计算它.
  4. 必须处理加法(+),减法( - ),乘法(*),整数除法(/),余数(%),幂(**),增量(++),减量( - ),gcd() ,factorial()和其他常见的整数算术计算有效.能够处理不产生整数结果的sqrt()(平方根),log()(对数)等函数是一个优点.处理符号计算的能力甚至更好.

这是我到目前为止发现的:

  1. JavaBigIntegerBigDecimal类:到目前为止我一直在使用它们.我已经阅读了源代码,但我不了解下面的数学.它可能基于我从未学过的理论/算法.
  2. 内置的整数类型或bc/Python/Ruby/Haskell/Lisp/Erlang/OCaml/PHP /其他一些语言的核心库:我曾经使用过其中的一些,但我不知道他们使用的是哪个库,或者他们正在使用哪种实现方式.

我所知道的:

  1. 使用char作为十进制数字,使用char*作为十进制字符串,并使用for循环对数字进行计算.
  2. 使用int(或long intlong long)作为基本"单元"并将其数组作为任意长整数,并使用for循环对元素进行计算.
  3. 使用整数类型将十进制数字(或几位数)存储为BCD(二进制编码的十进制).
  4. Booth的乘法算法 …

c c++ biginteger gmp bigdecimal

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

将BigDecimal格式化为字符串,最多2位十进制数,在小数部分删除0

我有一个BigDecimal数字,我只考虑它的2位小数,所以我截断它使用:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN)
Run Code Online (Sandbox Code Playgroud)

现在我想将它打印为String但是如果它是0则删除小数部分,例如:

1.00 - > 1

1.50 - > 1.5

1.99 - > 1.99

我尝试使用Formatter,formatter.format,但我总是得到2位小数.

我怎样才能做到这一点?也许从bd.toPlainString()处理字符串?

java formatting bigdecimal

73
推荐指数
4
解决办法
15万
查看次数

使用BigDecimal处理货币

我试图使用longs为自己的货币制作自己的类,但显然我应该使用BigDecimal.有人可以帮助我开始吗?什么是用最好的方式BigDecimalS代表美元货币,比如至少使它但没有对仙超过2位小数,等等.对于API BigDecimal是巨大的,我不知道要使用哪些方法.此外,BigDecimal具有更好的精度,但如果它通过一个double?如果我做新的BigDecimal(24.99),它会如何与使用double?或者我应该使用使用的构造函数String

java currency bigdecimal

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

BigDecimal到字符串

我有一个BigDecimal对象,我想将其转换为字符串.问题是我的值得分,我得到一个巨大的数字(长度),我只需要字符串中的原始数字,例如:for

BigDecimal bd = new BigDecimal(10.0001)
System.out.println(bd.toString());
System.out.println(bd.toPlainString());
Run Code Online (Sandbox Code Playgroud)

输出是:

10.000099999999999766941982670687139034271240234375
10.000099999999999766941982670687139034271240234375
Run Code Online (Sandbox Code Playgroud)

我需要输出正好是10.0001字符串中的数字

java string bigdecimal

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

如何处理Java BigDecimal性能?

我为生活编写货币交易应用程序,所以我必须处理货币价值(遗憾的是,Java仍然没有十进制浮动类型,并且没有任何东西可以支持任意精确的货币计算)."使用BigDecimal!" - 你可能会说.我做.但现在我有一些代码在性能一个问题,BigDecimal为超过1000次(!)慢于double原语.

计算很简单:系统做什么是计算a = (1/b) * c很多很多次(其中a,bc有固定的点值).然而,问题在于此(1/b).我不能使用定点算术,因为没有固定点.而且BigDecimal result = a.multiply(BigDecimal.ONE.divide(b).multiply(c)不仅丑陋,而且缓慢.

我可以用什么来代替BigDecimal?我需要至少10倍的性能提升.我发现了其他优秀的JScience库,它具有任意精度的算术,但它甚至比BigDecimal慢.

有什么建议?

java math optimization currency bigdecimal

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

BigDecimal乘以零

我正在使用BigDecimal进行简单的乘法运算,并且在乘以零时我发现了一些奇怪的行为(在这个用例中乘以零是正确的).

基本数学告诉我,任何乘以零的数字都将等于零(参见:零产品属性乘法属性)

但是,以下代码将始终失败并出现相同的错误:

assertEquals(new BigDecimal(0), new BigDecimal(22.3).multiply(new BigDecimal(0)));
Run Code Online (Sandbox Code Playgroud)
java.lang.AssertionError: 
Expected :0
Actual   :0E-48
Run Code Online (Sandbox Code Playgroud)

这是BigDecimal的不准确,还是我在某处遗漏了数学的一些利基分支?

注意:在IntelliJ 11中运行的JDK 1.6.0_27

java rounding-error bigdecimal numerical-analysis

58
推荐指数
3
解决办法
4377
查看次数

将double转换为BigDecimal并设置BigDecimal Precision

在Java中,我想获取一个double值并将其转换为a BigDecimal并将其String值打印到一定的精度.

import java.math.BigDecimal;
public class Main {
    public static void main(String[] args) {
        double d=-.00012;
        System.out.println(d+""); //This prints -1.2E-4

        double c=47.48000;
        BigDecimal b = new BigDecimal(c);
        System.out.println(b.toString()); 
        //This prints 47.47999999999999687361196265555918216705322265625 
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印这个巨大的东西:

47.47999999999999687361196265555918216705322265625

并不是

47.48

我正在进行BigDecimal转换的原因有时候,double值会包含很多小数位(即-.000012),将double转换为String时会产生科学记数法-1.2E-4.我想以非科学记数法存储String值.

我想让BigDecimal总是有两个精度单位:"47.48".BigDecimal可以限制转换为字符串的精度吗?

java double bigdecimal

58
推荐指数
6
解决办法
20万
查看次数

对于纬度/经度,Java double vs BigDecimal

当存储通常格式为44.087585(即在点之前最多2个数字和6dp)的纬度/经度时,我是否需要打扰bigdecimals?

java double geospatial bigdecimal latitude-longitude

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

Java,只提取BigDecimal的小数部分?

在Java中,我正在使用BigDecimal该类,我的部分代码要求我从中提取小数部分. BigDecimal似乎没有任何内置的方法来帮助我获得小数点后的数字BigDecimal.

例如:

BigDecimal bd = new BigDecimal("23452.4523434");
Run Code Online (Sandbox Code Playgroud)

我想4523434从上面提到的数字中提取出来.最好的方法是什么?

java bigdecimal

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

如何将String解析为BigDecimal?

我有这个字符串:10,692,467,440,017.120(这是一个金额).

我想将它解析为BigDecimal.问题是我尝试了DecimalFormat和NumbeFormat都是徒劳的.有帮助吗?

java string parsing bigdecimal decimalformat

57
推荐指数
4
解决办法
20万
查看次数