这是真的吗?
它们相似但不完全相同。更具体地说:Java 版本可以表示 C# 版本能表示的每个值,但反过来则不成立。
为什么要使用“大”前缀?
Java 的 BigDecimal
可以拥有任意的精度,因此可以任意大。如果你想创建一个具有千位精度的 BigDecimal
,你可以轻松实现。
相比之下,C# 的 decimal
具有固定的大小;它占用 128 位并提供 28 位小数精度。
更准确地说:这两种类型都可以给出以下形式的数字:
+/- someInteger / 10 ^ someExponent
在 C# 中,someInteger
是一个 96 位无符号整数,someExponent
是介于 0 到 28 之间的整数。someInteger
是任意大小的,someExponent
是一个带符号的 32 位整数。没错 - 这就是对应的类型。
由于您在使用 C# 之后使用 Java - 不要太惊讶地发现像这样的小细节 - 或者当没有简单的方法可以做到像 C# 中“容易”做到的事情时不要太沮丧。我首先想到的是 int & int? - 在 Java 中,您只需使用 int 和 Integer。
C# 有幸在 Java 之后出现,因此已经修复/简化了许多(在我看来)糟糕的决策。此外,它有助于 C# 是由Andres Hejlsberg(他被认为是最好的编程语言设计师之一)设计的,并且经常“更新”,而 Java 并非如此(您可能目睹了自2000年以来添加到 C# 的所有内容 - complete list)。
C#的Decimal类型和Java的BigDecimal类型不是等价的。BigDecimal是任意精度的,它可以确切地表示任何数字到任何精度(直到内存耗尽为止)。
C# Decimal是浮点数但“固定长度”(128位)。大多数情况下,这已经足够了!Decimal比BigDecimal快得多,因此,除非你真的需要很高的精度,否则它是一种更好的选择。
对于Java,您可能需要的是https://github.com/tools4j/decimal4j或类似库。
BigDouble
默认情况下可以精确地进行数学计算,或在无法处理时抛出异常。相反,Decimal
将会默默地舍去它无法处理的小数位。例如,在将1除以536870912时,Java 的BigDecimal
将计算值为 0.00000000186264514923095703125,而 .NET 的Decimal
则将其计算为 0.0000000018626451492309570312D。 - supercatBigDecimal
。 - supercat