ASP.NET将C转换为F.C#VS 2010。。。计算误差
我试图在VisualStudio2010中使用C#ASP.net web表单将摄氏温度转换为华氏温度 我正在使用函数执行转换,包括以下代码行:ASP.NET将C转换为F.C#VS 2010。。。计算误差,c#,asp.net,visual-studio-2010,C#,Asp.net,Visual Studio 2010,我试图在VisualStudio2010中使用C#ASP.net web表单将摄氏温度转换为华氏温度 我正在使用函数执行转换,包括以下代码行: 返回(摄氏度*(9/5))+32 算错了!如果我输入摄氏度=16,我得到48 我也尝试过用PHP做同样的事情,-我得到了60,这是我应该得到的 你知道这里有什么问题吗?你得到这个结果是因为整数除法。9和5是整数-不是浮点数/双精度数/小数或其他能够存储小数部分的类型9/5导致1中的分数部分被删除,这就是48的来源。尝试9.0/5.0,您会看到不同的结果。
返回(摄氏度*(9/5))+32代码>
算错了!如果我输入摄氏度=16,我得到48
我也尝试过用PHP做同样的事情,-我得到了60,这是我应该得到的
你知道这里有什么问题吗?你得到这个结果是因为整数除法。9和5是整数-不是浮点数/双精度数/小数或其他能够存储小数部分的类型9/5
导致1
中的分数部分被删除,这就是48的来源。尝试9.0/5.0
,您会看到不同的结果。您得到这个结果是因为整数除法。9和5是整数-不是浮点/双精度/小数或其他能够存储数字小数部分的类型9/5
导致1
中的分数部分被删除,这就是48的来源。尝试9.0/5.0
,您将看到不同的结果。您将看到9/5
在整数算术中求值,值为1。基本上你的表达式就是加16
你想要的是:
// Force the 9.0 / 5.0 to be evaluated as a double
return (celsius * (9.0 / 5.0)) + 32;
或者,只需更改计算分组,即可保持整数运算:
return ((celsius * 9) / 5) + 32;
如果您的输入和预期输出是整数,我会选择后者。显然,现在有更大的溢出风险。。。但仅在温度非常高的情况下:)
请注意,这将始终向下舍入-如果您想要数学上最接近的值,您可能仍然希望使用浮点执行算术,然后应用舍入,例如
return (int) (Math.Round((celsius * (9.0 / 5.0)) + 32));
请注意,这将对两个整数之间的中点使用银行家四舍五入(从四舍五入到偶数)。您将看到在整数算术中计算9/5
,给出值1。基本上你的表达式就是加16
你想要的是:
// Force the 9.0 / 5.0 to be evaluated as a double
return (celsius * (9.0 / 5.0)) + 32;
或者,只需更改计算分组,即可保持整数运算:
return ((celsius * 9) / 5) + 32;
如果您的输入和预期输出是整数,我会选择后者。显然,现在有更大的溢出风险。。。但仅在温度非常高的情况下:)
请注意,这将始终向下舍入-如果您想要数学上最接近的值,您可能仍然希望使用浮点执行算术,然后应用舍入,例如
return (int) (Math.Round((celsius * (9.0 / 5.0)) + 32));
请注意,这将对两个整数之间的中点使用银行家四舍五入(从四舍五入到偶数)。我猜celsius
是一个int
,而9/5是一个整数
相反,请尝试:
return ((double)celsius * (9.0 / 5.0)) + 32.0;
我猜摄氏度
是一个整数
,而9/5是一个整数
相反,请尝试:
return ((double)celsius * (9.0 / 5.0)) + 32.0;
检查您的数据类型-使9,5和32双;C#会自动将它们假定为int。检查您的数据类型-使9、5和32加倍;C#会自动将它们假定为整数。对于第二个解决方案,您将得到比前一个更接近的答案-但如果五倍于您的摄氏温度不能被九平均整除,它仍然会丢失任何分数分量。如果您想要整数返回类型,那么使用浮点运算和舍入运算似乎比简单的截断更可取,也更精确+“谢谢你说得比我的回答更详细。”狱警:可能吧。我想这取决于OP想要什么。将进行编辑以添加注释。对于第二个解决方案,您将得到比前一个更接近的答案-但如果五倍于您的摄氏温度不能被九平均整除,它仍将丢失任何分数分量。如果您想要整数返回类型,那么使用浮点运算和舍入运算似乎比简单的截断更可取,也更精确+“谢谢你说得比我的回答更详细。”狱警:可能吧。我想这取决于OP想要什么。将编辑以添加注释。