Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未分配给浮点变量时出现浮点错误_C# - Fatal编程技术网

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
times
float
is
float
完全相同的值


提前感谢您的回复

如注释中所述,您应该使用
十进制
作为类型,而不是
浮点
,以避免此类问题

使用值
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