在.NET中,十进制、浮点和双精度之间有什么区别?

什么时候有人会用这些?


当前回答

没有人提到

在默认设置中,Floats(System.Single)和doubles(System.Double)永远不会使用Decimal(System.Decimal)将始终使用溢出检查。

我是说

decimal myNumber = decimal.MaxValue;
myNumber += 1;

引发OverflowException。

但这些并不:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

其他回答

浮动:

它是一个浮点二进制点类型变量。这意味着它以二进制形式表示数字。浮点是一种单精度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。

精度:

浮点以单精度表示数据。双精度表示数据。十进制比浮点和双精度更高。

准确度:

浮点运算不如双精度和小数精度高。双精度比浮点精度高,但比十进制精度低。十进制比浮点和双精度更精确。

每种方法的主要区别在于精度。

float是32位数字double是64位数字十进制是128位数字

在.Net(c#)中定义十进制、浮点和双精度

您必须将值提到为:

Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;

并检查结果。

每个占用的字节为

Float - 4
Double - 8
Decimal - 12

所有这些类型的问题是存在一定的不精确性而且这个问题可能发生在小的小数上,如下面的例子

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

问题:bLower变量包含哪个值?

答案:在32位机器上,bLower包含TRUE!!!

如果我将Double替换为Decimal,bLower包含FALSE,这是一个好答案。

在double中,问题是fMean fDelta=1.09999999999,低于1.1。

注意:我认为同样的问题肯定会出现在其他数字上,因为十进制只是精度更高的双精度,而且精度总是有限制的。

事实上,Double、Float和Decimal对应于COBOL中的二进制十进制!

很遗憾,在.Net中不存在COBOL中实现的其他数字类型

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

这对我来说是一个有趣的线索,因为今天,我们刚刚遇到了一个令人讨厌的小错误,关于十进制比浮点精度低。

在我们的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将它们设置为零。

古怪的非常奇怪。