在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
当前回答
对于游戏和嵌入式系统等内存和性能都至关重要的应用程序,浮点运算通常是数字类型的选择,因为它速度更快,大小只有双倍运算的一半。整数曾经是首选的武器,但在现代处理器中,浮点性能已经超过了整数。十进制是正确的!
其他回答
每种方法的主要区别在于精度。
float是32位数字double是64位数字十进制是128位数字
Decimal、Double和Float变量类型在存储值的方式上有所不同。精度是主要区别,其中float是单精度(32位)浮点数据类型,double是双精度(64位)浮点类型,decimal是128位浮点数据类型。
浮点-32位(7位)
双64位(15-16位)
十进制-128位(28-29位有效数字)
有关…的详细信息。。。十进制、浮点和双精度之间的差异
这对我来说是一个有趣的线索,因为今天,我们刚刚遇到了一个令人讨厌的小错误,关于十进制比浮点精度低。
在我们的C#代码中,我们从Excel电子表格中读取数字值,将其转换为十进制,然后将该十进制发送回服务以保存到SQL Server数据库中。
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
decimal value = 0;
Decimal.TryParse(cellValue.ToString(), out value);
}
现在,对于我们几乎所有的Excel值,这都非常有效。但是对于一些非常小的Excel值,使用decimal.TryParse完全丢失了值。一个这样的例子是
单元格值=0.00006317592Decimal.TryParse(cellValue.ToString(),out值);//将返回0
奇怪的是,解决方案是先将Excel值转换为双精度值,然后再转换为十进制值:
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
double valueDouble = 0;
double.TryParse(cellValue.ToString(), out valueDouble);
decimal value = (decimal) valueDouble;
…
}
即使double的精度低于十进制,这实际上确保了小数字仍然可以被识别。由于某种原因,double.TryParse实际上能够检索这样的小数字,而decimal.TryPars将它们设置为零。
古怪的非常奇怪。
对于游戏和嵌入式系统等内存和性能都至关重要的应用程序,浮点运算通常是数字类型的选择,因为它速度更快,大小只有双倍运算的一半。整数曾经是首选的武器,但在现代处理器中,浮点性能已经超过了整数。十进制是正确的!
Double和float可以被整数零除,在编译和运行时都没有异常。小数不能除以整数零。如果你这样做,编译总是会失败。