使用小数类型的 C# 百分比计算会导致问题
C# percent calculation with decimal type causes problems
decimal hundred = 100;
decimal value = 5000;
decimal sum = 1100000;
decimal valuePercentOfSum = value / sum * hundred; //result = 0.4545454545454545454545454500M
decimal percentOfSum = sum / hundred * valuePercentOfSum; //result = 4999.9999999999999999999999500M
我希望 percentOfSum
的结果是 value (5000)
的原始值
我需要一种方法来进行这样的来回计算,我不能简单地进行任何舍入。
有什么帮助吗?
有人必须舍入(不管你喜不喜欢),因为你在处理无理数 and/or 数值类型,精度有限
如果您使用 double
,它会为您 Round,如果您使用 decimal
,它会更精确。但是,您将不得不接受这样一个事实:它保留了它所拥有的精度。
根据你想做什么,decimal
可能不太方便,但如果你了解 类型 的后果(并且没有免费的午餐),您可以相应地选择。
如果您使用双精度而不是十进制,您应该会得到更好的结果。
double hundred = 100;
double value = 5000;
double sum = 1100000;
double valuePercentOfSum = value / sum * hundred;
double percentOfSum = sum / hundred * valuePercentOfSum; // result = 5000
decimal hundred = 100;
decimal value = 5000;
decimal sum = 1100000;
decimal valuePercentOfSum = value / sum * hundred; //result = 0.4545454545454545454545454500M
decimal percentOfSum = sum / hundred * valuePercentOfSum; //result = 4999.9999999999999999999999500M
我希望 percentOfSum
的结果是 value (5000)
我需要一种方法来进行这样的来回计算,我不能简单地进行任何舍入。
有什么帮助吗?
有人必须舍入(不管你喜不喜欢),因为你在处理无理数 and/or 数值类型,精度有限
如果您使用 double
,它会为您 Round,如果您使用 decimal
,它会更精确。但是,您将不得不接受这样一个事实:它保留了它所拥有的精度。
根据你想做什么,decimal
可能不太方便,但如果你了解 类型 的后果(并且没有免费的午餐),您可以相应地选择。
如果您使用双精度而不是十进制,您应该会得到更好的结果。
double hundred = 100;
double value = 5000;
double sum = 1100000;
double valuePercentOfSum = value / sum * hundred;
double percentOfSum = sum / hundred * valuePercentOfSum; // result = 5000