C# 为什么几个数字相乘的结果与计算器相乘的结果不同?

C# 为什么几个数字相乘的结果与计算器相乘的结果不同?,c#,C#,有一些浮点数和整数,我必须将它们相乘 float length = 40; float width = 25.7f; float height = 27.6f; int count = 361; var result = length * width * height * count; 此代码的输出等于10242826 当我使用计算器时,输出为:10242580.8 为什么几个数字相乘的结果与计算器相乘的结果不同 这种差异只是由代码中使用的浮点数引起的。 它们的精度较小 要修复代码,只需将其替

有一些浮点数和整数,我必须将它们相乘

float length = 40;
float width = 25.7f;
float height = 27.6f;
int count = 361;
var result = length * width * height * count;
此代码的输出等于10242826

当我使用计算器时,输出为:10242580.8

为什么几个数字相乘的结果与计算器相乘的结果不同


这种差异只是由代码中使用的浮点数引起的。 它们的精度较小

要修复代码,只需将其替换为双精度:

double length = 40;
double width = 25.7d; // <-Remofe "f" IMPORTANT! or use "d" instead (e.g.: 25.7d)
double height = 27.6d; // <-Remofe "f" IMPORTANT! or use "d" instead (e.g. 27.6d)
int count = 361;
var result = length * width * height * count;
另外,您也可以使用这样的简化版本:

var length = 40;
var width = 25.7; // No need of "d", as the type is automatically set to double
var height = 27.6; // No need of "d", as the type is automatically set to double
var count = 361;
var result = length * width * height * count;

这种差异只是由代码中使用的浮点数引起的。 它们的精度较小

要修复代码,只需将其替换为双精度:

double length = 40;
double width = 25.7d; // <-Remofe "f" IMPORTANT! or use "d" instead (e.g.: 25.7d)
double height = 27.6d; // <-Remofe "f" IMPORTANT! or use "d" instead (e.g. 27.6d)
int count = 361;
var result = length * width * height * count;
另外,您也可以使用这样的简化版本:

var length = 40;
var width = 25.7; // No need of "d", as the type is automatically set to double
var height = 27.6; // No need of "d", as the type is automatically set to double
var count = 361;
var result = length * width * height * count;

要为@Just Shadow的优秀答案添加不同的方法,您还可以使用不同的测量单位,并避免使用浮点或双精度:

如果你有25.7米,你可以表示为2570厘米,这是一个整数

这项技术有时在处理货币时使用,因此不使用1.25美元表示法,而是以美分为基础,得到125美分


只要您知道所需的精度级别,就可以进行这些转换,并摆脱有问题且昂贵的浮点运算。

要为@Just Shadow的优秀答案添加不同的方法,您还可以使用不同的测量单位,并避免使用浮点或双精度:

如果你有25.7米,你可以表示为2570厘米,这是一个整数

这项技术有时在处理货币时使用,因此不使用1.25美元表示法,而是以美分为基础,得到125美分

只要知道所需的精度级别,就可以进行这些转换,并摆脱有问题且昂贵的浮点运算。

float和double在内部表示基数为2的数字。以基数2表示的数字精确表示为float和double。因此,大多数以10为基数的分数分量的文字将无法精确表示

但在这种情况下,您可以使用小数来获得精确的值,因为实数字面值是以10为基数的,所以小数可以精确地表示数字,如25.7。

float和double在内部表示以2为基数的数字。以基数2表示的数字精确表示为float和double。因此,大多数以10为基数的分数分量的文字将无法精确表示


但在这种情况下,您可以使用小数来获得精确的值,因为实际文字以10为基数,小数可以精确地表示数字,如25.7。

如果我运行您的代码,我会得到10242580。Float有一个精度或6-9位数字,请参见,因此这两个值在精度范围内相等。如果您需要更多,请使用双精度或十进制。这是由于精度。使用精度更高的double可能就是您所要寻找的。顺便说一下,如果使用“var”来为数值计算分配数据类型,我认为这是一个错误。您应该是明确的。至于您和我们看到的不同结果,请参见和。visual studio、.NET framework、OS的版本是什么?我刚刚创建了一个.NET核心控制台应用程序。在VS2019中,在windows 10上使用您的精确代码,如果我将鼠标悬停在结果上,我将得到10242581@MitchWheat,Vs 2019和.Net core 3.0。如果我运行你的代码,我会得到10242580。Float有一个精度或6-9位数字,请参见,因此这两个值在精度范围内相等。如果您需要更多,请使用双精度或十进制。这是由于精度。使用精度更高的double可能就是您所要寻找的。顺便说一下,如果使用“var”来为数值计算分配数据类型,我认为这是一个错误。您应该是明确的。至于您和我们看到的不同结果,请参见和。visual studio、.NET framework、OS的版本是什么?我刚刚创建了一个.NET核心控制台应用程序。在VS2019中,在windows 10上使用您的精确代码,如果我将鼠标悬停在结果上,我将得到10242581@MitchWheat,Vs 2019和.Net core 3.0。请注意,更改为双倍并不是通用的解决方案,它是一种适用于这些小数字的解决方案。把数字变大,计算器又会有不同。请注意,变为双倍并不是通用的解决方案,这是一种解决这些小数字的方法。把数字调大,计算器又会有变化。