在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
当前回答
在.Net(c#)中定义十进制、浮点和双精度
您必须将值提到为:
Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;
并检查结果。
每个占用的字节为
Float - 4
Double - 8
Decimal - 12
其他回答
正如前面提到的,整数是整数。他们无法存储点,例如.7、.42和.007。如果需要存储非整数的数字,则需要不同类型的变量。您可以使用double类型或float类型。您以完全相同的方式设置这些类型的变量:键入double或float,而不是使用int。这样地:
float myFloat;
double myDouble;
(float是“浮点”的缩写,意思是一个末尾有点的数字。)
两者的区别在于它们所能容纳的数字的大小。对于浮点数,您的数字最多可以有7位。对于双打,最多可以有16位数字。更准确地说,这里是官方尺寸:
float: 1.5 × 10^-45 to 3.4 × 10^38
double: 5.0 × 10^-324 to 1.7 × 10^308
float是32位数字,double是64位数字。
双击新按钮以获取代码。在按钮代码中添加以下三行:
double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
停止程序并返回编码窗口。更改此行:
myDouble = 0.007;
myDouble = 12345678.1234567;
运行程序并单击双击按钮。消息框正确显示数字。不过,在末尾添加另一个数字,C#将再次向上或向下舍入。寓意是,如果你想要准确,请小心四舍五入!
这对我来说是一个有趣的线索,因为今天,我们刚刚遇到了一个令人讨厌的小错误,关于十进制比浮点精度低。
在我们的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可以被整数零除,在编译和运行时都没有异常。小数不能除以整数零。如果你这样做,编译总是会失败。
浮动:
它是一个浮点二进制点类型变量。这意味着它以二进制形式表示数字。浮点是一种单精度32位(6-9位有效数字)数据类型。它主要用于图形库,因为对处理能力的要求非常高,也用于舍入误差不太重要的情况。
双倍:
它也是一个具有双精度和64位大小(15-17位有效数字)的浮点二进制点类型变量。Double可能是真实值最常用的数据类型,但金融应用程序和需要高精度的地方除外。
十进制的:
它是一个浮点型变量。这意味着它使用十进制数字(0-9)表示数字。它使用128位(28-29位有效数字)来存储和表示数据。因此,它比浮点和双精度更高。由于它们的高精度和易于避免舍入误差,它们主要用于金融应用。
例子:
using System;
public class GFG {
static public void Main()
{
double d = 0.42e2; //double data type
Console.WriteLine(d); // output 42
float f = 134.45E-2f; //float data type
Console.WriteLine(f); // output: 1.3445
decimal m = 1.5E6m; //decimal data type
Console.WriteLine(m); // output: 1500000
}
}
浮点、双精度和十进制之间的比较基于:
使用的位数:
浮点使用32位表示数据。Double使用64位表示数据。十进制使用128位表示数据。
数值范围:
浮动值范围约为±1.5e-45至±3.4e38。双倍值范围约为±5.0e-324至±1.7e308。十进制值的范围约为±1.0e-28至±7.9e28。
精度:
浮点以单精度表示数据。双精度表示数据。十进制比浮点和双精度更高。
准确度:
浮点运算不如双精度和小数精度高。双精度比浮点精度高,但比十进制精度低。十进制比浮点和双精度更精确。
十进制结构严格适用于要求精确性的财务计算,这些计算相对不允许四舍五入。然而,小数不足以用于科学应用,原因如下:
由于所测量的物理问题或伪影的实际限制,在许多科学计算中,一定程度的精度损失是可以接受的。在金融领域,精度的损失是不可接受的。对于大多数操作,十进制比浮点运算和双精度运算慢得多,这主要是因为浮点运算是以二进制进行的,而十进制运算是以10为基数进行的(即浮点运算和双倍运算是由FPU硬件处理的,如MMX/SSE,而小数是在软件中计算的)。尽管十进制支持更多位数的精度,但它的值范围比双精度小得令人无法接受。因此,十进制不能用来表示许多科学价值。