与传统上使用的" decimal Amount"相比,在没有浮点数(如" int amountcent ")的属性中存储资金的优缺点是什么?
有时我看到一个被使用,有时我看到另一个被使用。什么是更好的方法?
的例子:使用AmountInCents
:
public class Money
{
public int AmountInCents { get; set; }
...
}
public class Money
{
public decimal Amount { get; set; }
...
}
注:我省略了"货币"一词。字段,因为它与这个问题无关
当你对小数进行除法或计算时,
decimal
真的很有用。
其精度水平远高于float
或double
所支持的。随着时间的推移,涉及这些值类型的多次计算将引入舍入误差,例如我们认为的0.1
实际上是0.99999
。由于这个原因,在比较float
或double
值时,不能依赖于使用==
比较器,实际上可以使用以下内容:
bool areEqual = Math.Abs(float1-float2)< 0.0001;
更好,因为它引入了允许的精度公差。
作为舍入误差的说明:
double x = 0.1 + 0.1 + 0.1;
double y = 0.3;
double z = 0.1;
double resultD=0;
for(int i=0;i<3;i++){
resultD += z;
}
Console.WriteLine($"x -> {x}");
Console.WriteLine($"y -> {y}");
Console.WriteLine($"resultD -> {resultD}");
Console.WriteLine($"x == y -> {x == y}");
Console.WriteLine($"x == resultD -> {x == resultD}");
decimal dec1 = 0.1m + 0.1m + 0.1m;
decimal dec2 = 0.3m;
decimal dec3 = 0.1m;
decimal resultDec=0;
for(int i=0;i<3;i++){
resultDec += dec3;
}
Console.WriteLine($"dec1 -> {dec1}");
Console.WriteLine($"dec2 -> {dec2}");
Console.WriteLine($"resultDec -> {resultDec}");
Console.WriteLine($"dec1 == dec2 -> {dec1 == dec2}");
Console.WriteLine($"dec1 == resultDec -> {dec1 == resultDec}");
给出如下输出:
x -> 0.3
y -> 0.3
resultD -> 0.3
x == y -> False
x == resultD -> True
dec1 -> 0.3
dec2 -> 0.3
resultDec -> 0.3
dec1 == dec2 -> True
dec1 == resultDec -> True
注意x
和y
的值看起来是相等的,但是比较失败了,这是因为值有一点点不同。
如果你永远不打算使用小数值,即避免除法,那么你可以很高兴地坚持使用整数类型。