C# 未分配给浮点变量时出现浮点错误
我有一个静态方法C# 未分配给浮点变量时出现浮点错误,c#,C#,我有一个静态方法GetFraction,它返回价格中的美分,如下所示: public static class PriceUtil { public static int GetFraction(float price) { int PriceInt = (int)(100 * price); return PriceInt % 100; } } 对于$23.79的价格,此方法返回78美分,而不是79美分。在调试时,我无意中修复了如下错
GetFraction
,它返回价格中的美分,如下所示:
public static class PriceUtil
{
public static int GetFraction(float price)
{
int PriceInt = (int)(100 * price);
return PriceInt % 100;
}
}
对于$23.79的价格,此方法返回78美分,而不是79美分。在调试时,我无意中修复了如下错误:
public static class PriceUtil
{
public static int GetFraction(float price)
{
float PriceFloat = 100 * price;
int PriceInt = (int)(PriceFloat);
return PriceInt % 100;
}
}
我不明白为什么将(100*price)赋值给浮点变量可以解决这个问题。好的,强制转换为整数应用于与int
timesfloat
isfloat
完全相同的值
提前感谢您的回复 如注释中所述,您应该使用
十进制
作为类型,而不是浮点
,以避免此类问题
使用值23.79f
不会出现您在我的计算机上描述的问题,因此我猜测价格是通过以前的计算得出的。下面是一个演示:
var value = 23.7899999f;
Console.WriteLine(value);
var fraction = ((int) (value*100))%100;
Console.WriteLine(fraction);
这段代码的输出是
23.79
78
现在输出为
23.79
79
23.79
79
为此,我将使用十进制变量。货币是一个即使是很小的分数也很重要的地方,这对浮动货币不起作用;在函数的两个实现中,检入调试器会为参数
23.79f
生成79的值。检查这里:但是,我完全赞成使用Decimal
,而不是float
。在第二个示例中,您唯一看到的int是来自%
运算符的结果。在第一个示例中,您将产品(float*100
)强制转换为int,然后从中获取%
。这最像是一个浮点错误。一般来说,为了避免这些情况,除非您需要整数值,否则请将数字保留为小数。至于原因,请记住,CLR的实现允许使用较大的类型进行浮点计算,因此,当您强制为变量赋值时,可能会执行截断。@ChristianSauer,Flater和Codor:感谢您为存储价格指出了更好的类型。我会记住这一点。@Damien_The_unsiever和Martin Liversage:这两种解释似乎都指向相同的原因,即内部计算使用更高的位数。也许这就是为什么将它赋给int
变量有助于我对数字进行四舍五入。我会记住这一点,并确保在将值传递给其他对象之前对其进行转换/舍入。
23.79
79