使用 "int AmountInCents" 而不是在 C# 中使用 "decimal Amount" 来存储资金是个好主意吗?



与传统上使用的" decimal Amount"相比,在没有浮点数(如" int amountcent ")的属性中存储资金的优缺点是什么?

有时我看到一个被使用,有时我看到另一个被使用。什么是更好的方法?

的例子:使用AmountInCents

:

public class Money
{
public int AmountInCents { get; set; }
...
}

public class Money
{
public decimal Amount { get; set; }
...
}

注:我省略了"货币"一词。字段,因为它与这个问题无关

当你对小数进行除法或计算时,

decimal真的很有用。

其精度水平远高于floatdouble所支持的。随着时间的推移,涉及这些值类型的多次计算将引入舍入误差,例如我们认为的0.1实际上是0.99999。由于这个原因,在比较floatdouble值时,不能依赖于使用==比较器,实际上可以使用以下内容:

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

注意xy的值看起来是相等的,但是比较失败了,这是因为值有一点点不同。

如果你永远不打算使用小数值,即避免除法,那么你可以很高兴地坚持使用整数类型。

最新更新