Java的BigDecimal是对应于C#的Decimal最接近的数据类型吗?

17
根据这里的图表,Java中对应C#的Decimal数据类型是BigDecimal

确实是这样吗?为什么要加上“Big”这个前缀呢?似乎在Java中并没有“SmallDecimal”或“LittleDecimal”(更不用说“MediumSizedDecimal”)。

不过我必须说,那个图表是我在这个问题上找到的最清晰的东西;其他链接在这里在这里以及在这里对我来说就像是经历了一场暴风雨后的密西西比河一样难以理解。

3个回答

33

这是真的吗?

它们相似但不完全相同。更具体地说:Java 版本可以表示 C# 版本能表示的每个值,但反过来则不成立。

为什么要使用“大”前缀?

Java 的 BigDecimal 可以拥有任意的精度,因此可以任意大。如果你想创建一个具有千位精度的 BigDecimal,你可以轻松实现。

相比之下,C# 的 decimal 具有固定的大小;它占用 128 位并提供 28 位小数精度。

更准确地说:这两种类型都可以给出以下形式的数字:

+/- someInteger / 10 ^ someExponent
在 C# 中,someInteger 是一个 96 位无符号整数,someExponent 是介于 0 到 28 之间的整数。
在 Java 中,someInteger 是任意大小的,someExponent 是一个带符号的 32 位整数。

1
另一个主要的区别是,BigDouble 默认情况下可以精确地进行数学计算,或在无法处理时抛出异常。相反,Decimal 将会默默地舍去它无法处理的小数位。例如,在将1除以536870912时,Java 的 BigDecimal 将计算值为 0.00000000186264514923095703125,而 .NET 的 Decimal 则将其计算为 0.0000000018626451492309570312D。 - supercat
@supercat,“BigDouble”?这是从哪里来的?你是不是想说“BigDecimal”? - Mauricio Morales
1
@MauricioMorales:我的错。是的,BigDecimal - supercat

26

没错 - 这就是对应的类型。

由于您在使用 C# 之后使用 Java - 不要太惊讶地发现像这样的小细节 - 或者当没有简单的方法可以做到像 C# 中“容易”做到的事情时不要太沮丧。我首先想到的是 int & int? - 在 Java 中,您只需使用 int 和 Integer。

C# 有幸在 Java 之后出现,因此已经修复/简化了许多(在我看来)糟糕的决策。此外,它有助于 C# 是由Andres Hejlsberg(他被认为是最好的编程语言设计师之一)设计的,并且经常“更新”,而 Java 并非如此(您可能目睹了自2000年以来添加到 C# 的所有内容 - complete list)。


2
在Java中,可空整数是整数的好处。我同意Hejlsberg - 他应该在极客的拉什莫尔山上有一席之地。不过我仍然想知道为什么它被称为“Big” decimal - 相对于什么而言是大的呢? - B. Clay Shannon-B. Crow Raven
@B.ClayShannon 我只能猜测,但我认为它被命名为BigDecimal是因为它是用于“大十进制数”的。更多信息请参见此处 - http://www.java2s.com/Questions_And_Answers/Java-Data-Type/bigdecimal/bigdecimal.htm - nikib3ro
5
之所以称其为“大”,有很充分的理由。请查看我的回答以了解详情。 - Eric Lippert
2
现在,关于Java被“定期更新”,我注意到Java刚刚经历了一次重大修订,因此它现在拥有C# 2.0的许多功能。 - Eric Lippert
@EricLippert,希望他们能继续“更新”;)。我很想看到Java中实现C#中的var-这将有助于声明所有那些在Java(或至少在Android)中非常常见的Class.Subclass的实例化。 - nikib3ro

1

C#的Decimal类型和Java的BigDecimal类型不是等价的。BigDecimal是任意精度的,它可以确切地表示任何数字到任何精度(直到内存耗尽为止)。

C# Decimal是浮点数但“固定长度”(128位)。大多数情况下,这已经足够了!Decimal比BigDecimal快得多,因此,除非你真的需要很高的精度,否则它是一种更好的选择。

对于Java,您可能需要的是https://github.com/tools4j/decimal4j或类似库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接