标签: bigdecimal

MongoDB - 十进制类型的值怎么样?

我目前正在学习并将MongoDB应用于一个小型金融相关项目.


当我阅读MongoDB in Action时,它说:

BSON数字类型通常出现的唯一其他问题是缺少小数支持.这意味着如果您计划在MongoDB中存储货币值,则需要使用整数类型并将值保持为美分.


我的财务相关产品将涉及一些货币价值,但我有点困惑或担心上述声明.这是我的问题:

  1. 我可以double用于currency values我项目中的那些人吗?
  2. 如果我直接使用double它们会发生什么或后果?
  3. 如果十进制类型是金融产品必备的东西,那么使用MongoDB是个坏主意吗?
  4. 这是什么意思you need to use an integer type and keep the values in cents?这是否意味着如果我要去商店1.34 dollars,那么我应该存储134 cents

谢谢

decimal bigdecimal mongodb bson

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

添加2个BigDecimal值

class Point {

  BigDecimal x;
  BigDecimal y;

  Point(double px, double py) {
    x = new BigDecimal(px);
    y = new BigDecimal(py);
  }

  void addFiveToCoordinate(String what) {
    if (what.equals("x")) {
      BigDecimal z = new BigDecimal(5);
      x.add(z);
    }
  }

  void show() {
    System.out.print("\nx: " + getX() + "\ny: " + getY());
  }

  public BigDecimal getX() {
    return x;
  }

  public BigDecimal getY() {
    return y;
  }

  public static void main(String[] args) {
    Point p = new Point(1.0, 1.0);
    p.addFiveToCoordinate("x");
    p.show();
  }
}
Run Code Online (Sandbox Code Playgroud)

好的,我想添加2个BigDecimal值.我正在使用带双打的构造函数(因为我认为它是可能的 …

java bigdecimal

30
推荐指数
2
解决办法
9万
查看次数

格式化BigDecimal,没有科学记数法,具有完全精度

我想一个转换BigDecimalString印刷的目的,但打印出所有的数字没有科学记数法.例如:

BigDecimal d = BigDecimal.valueOf(12334535345456700.12345634534534578901);
String out = d.toString(); // Or perform any formatting that needs to be done
System.out.println(out);
Run Code Online (Sandbox Code Playgroud)

我想要12334535345456700.12345634534534578901打印.现在我得到:1.23345353454567E+16.

java string-formatting bigdecimal

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

是否有JavaScript的十进制数学库?

在JavaScript中是否有一个成熟的库来进行基于十进制的数学运算,可能是任意精度的?

编辑:我希望这些信息是关于浮点相关问题的参考页面以及二进制浮点不合适时使用的替代方法:http://floating-point-gui.de/

javascript decimal bigdecimal

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

Scala和Java BigDecimal

我想在我的应用程序中从Java切换到基于Math的模块的脚本语言.这是由于Java的可读性和功能限制.

例如,在Java中我有这个:

BigDecimal x = new BigDecimal("1.1");
BigDecimal y = new BigDecimal("1.1");
BigDecimal z = x.multiply(y.exp(new BigDecimal("2"));
Run Code Online (Sandbox Code Playgroud)

如您所见,如果没有BigDecimal运算符重载,简单的公式会很快变得复杂.

有了双打,看起来很好,但我需要精确度.

我希望Scala能做到这一点:

var x = 1.1;
var y = 0.1;
print(x + y);
Run Code Online (Sandbox Code Playgroud)

默认情况下,我会得到类似十进制的行为,唉,Scala默认情况下不使用十进制计算.

然后我在Scala中这样做:

var x = BigDecimal(1.1);
var y = BigDecimal(0.1);
println(x + y);
Run Code Online (Sandbox Code Playgroud)

我仍然得到一个不精确的结果.

在Scala中我有什么不对的吗?

也许我应该使用Groovy来最大化可读性(它默认使用小数)?

java math groovy scala bigdecimal

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

如何将BigInteger转换为BigDecimal?

有没有办法将a转换BigIntegerBigDecimal

我知道你可以从a BigDecimal到a BigInteger,但是我找不到一种方法可以用Java来反过来.

java biginteger bigdecimal

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

如何使用BigDecimal显示总是2个小数点的数字?

我使用BigDecimal来获得一些价格值.要求是这样的,我们从数据库获取的值,显示的值应该有2个小数点.

例如:

取值为1 - 应显示为1.00
取值为1.7823 - 应显示为1.78

我正在使用setScale(2, BigDecimal.ROUND_HALF_UP)但仍有一些地方,如果来自DB的数据是一个整数,那么同样的显示!!

我的意思是如果DB的值为0,则仅显示为0.我希望它显示为0.00

谢谢

java precision decimal-point bigdecimal

27
推荐指数
4
解决办法
7万
查看次数

为什么Java BigDecimal会返回1E + 1?

为什么这个代码有时会返回1E + 1,而对于其他输入(例如17),输出不会以科学计数法打印?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
Run Code Online (Sandbox Code Playgroud)

java floating-point bigdecimal

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

BigDecimal.ZERO与新BigDecimal(0).使用哪个,为什么?

我想知道这两个是否相同.谁能验证?(我试图用第二个替换第一个)

BigDecimal totalCurrentSales = new BigDecimal(0);
Run Code Online (Sandbox Code Playgroud)

BigDecimal totalCurrentSales = BigDecimal.ZERO;
Run Code Online (Sandbox Code Playgroud)

我想问的原因是,它是不恰当的,第一种方式宣告它,因为你不应该创建已有的实例BigIntegerBigDecimal (ZERO, ONE, TEN).所以我想知道我是否可以说第二种方式,它仍然被认为是创建一个实例.而不是我必须创建一个变量zero或等于的变量BigDecimal.ZERO.或者还有其他方法吗?

我试过了

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);
Run Code Online (Sandbox Code Playgroud)

但日食并不太快乐.

java bigdecimal

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

Java的Bigdecimal.divide和舍入

在工作中,我们在尝试将大数除以1000时发现了一个问题.这个数字来自数据库.

说我有这个方法:

private static BigDecimal divideBy1000(BigDecimal dividendo) {
    if (dividendo == null) return null;

    return dividendo.divide(BigDecimal.valueOf(1000), RoundingMode.HALF_UP);
}
Run Code Online (Sandbox Code Playgroud)

当我拨打以下电话时

divideBy1000(new BigDecimal("176100000"))
Run Code Online (Sandbox Code Playgroud)

我收到176100的预期值.但是,如果我尝试下面这一行

divideBy1000(new BigDecimal("1761e+5"))
Run Code Online (Sandbox Code Playgroud)

我收到价值200000.为什么会这样?这两个数字是相同的,具有不同的表示,最新的是我从数据库收到的.我知道,不知何故,JVM将数字1761除以1000,向上舍入并在最后填充0.

避免这种行为的最佳方法是什么?请记住,原始号码不受我控制.

java bigdecimal

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