Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何决定使用什么-双精度还是十进制?_C#_.net - Fatal编程技术网

C# 如何决定使用什么-双精度还是十进制?

C# 如何决定使用什么-双精度还是十进制?,c#,.net,C#,.net,可能重复: 我在我的交易软件中使用double类型作为价格。 我注意到有时会有一些奇怪的错误。 如果价格在“点”后包含4位数字,如2.1234,则会出现这种情况 当我从我的程序“2.1234”发送时,市场订单以“2.1235”的价格显示 我不使用十进制,因为我不需要“极端”精度。例如,我不需要区分“2.0000000000 3”和“2.0000000000 2”。我需要一个点后最多6位数字 问题是——线路在哪里?何时使用十进制 我应该使用十进制进行任何财务操作吗?即使我只需要点后的一个数字?(

可能重复:

我在我的交易软件中使用
double
类型作为价格。 我注意到有时会有一些奇怪的错误。 如果价格在“点”后包含4位数字,如2.1234,则会出现这种情况

当我从我的程序“2.1234”发送时,市场订单以“2.1235”的价格显示

我不使用十进制,因为我不需要“极端”精度。例如,我不需要区分“2.0000000000 3”和“2.0000000000 2”。我需要一个点后最多6位数字

问题是——线路在哪里?何时使用十进制

我应该使用
十进制
进行任何财务操作吗?即使我只需要点后的一个数字?(1.1.2等)


我知道
decimal
非常慢,所以我更喜欢使用
double
,除非绝对需要
decimal

使用它是为表示10井的幂(即价格)而构建的。

对于金融操作,我总是使用decimal类型

当需要精确性和重要时,使用
decimal

如果准确性不是那么重要,那么可以使用
double


在您的情况下,您应该使用十进制作为财务事项。

十进制是处理价格的方法。

在处理希望(并且可以)以10为基数精确表示的数量时,请使用十进制。这包括货币值,因为您希望2.1234与2.1234完全相同

如果不需要在base-10中精确表示,请使用double。这通常适用于处理测量,因为这些已经是近似值,而不是精确量

当然,如果base-10中是否有准确的表示对您来说并不重要,则需要考虑其他因素,这些因素可能重要,也可能不重要,具体取决于具体情况:

  • double具有更大的范围(它可以处理非常大和非常小的量级)
  • 小数精度更高(有效位数更多)
  • 您可能需要使用double与一些不知道十进制的旧API交互
  • double比decimal快
  • 十进制具有更大的内存占用
Double是一种通用的浮点数据类型,decimal是专门用于货币和金融领域的。即使double通常可以工作,但在某些情况下,精细的十进制可能会防止出现问题(例如,当您得到数十亿的值时,舍入错误)

如果是金融软件,您可能应该使用十进制。总结得很好。

本例中有一个简单的回答:

decimal d = 0.3M+0.3M+0.3M;
            bool ret = d == 0.9M; // true
            double db = 0.3 + 0.3 + 0.3;
            bool dret = db == 0.9; // false

使用双精度的测试失败,因为其二进制表示形式(以2为基数)中的0.3是周期性的,因此您失去了精度。十进制以BCD表示,以10为基数,并且您没有意外失去有效数字。不幸的是,十进制比双精度慢得多。通常,我们使用十进制进行财务计算,其中必须考虑任何数字以避免公差,双精度/浮点数用于工程

一旦开始对双精度进行计算,您可能会遇到意外的舍入问题,因为双精度使用数字的二进制表示,而十进制使用保留十进制数字的十进制表示。这可能就是你正在经历的。若只对文本或数据库的double进行序列化和反序列化,而不进行任何舍入,那个么实际上就不会失去任何精度


但是,小数更适合表示货币值,因为您关心的是十进制数字(而不是double内部使用的二进制数字)。但是,如果您需要进行复杂的计算(例如精算师计算中使用的积分),您必须在进行计算之前将小数转换为双精度,从而抵消使用小数的优势


小数点还“记住”它有多少位数,例如,即使小数点1.230等于1.23,第一个小数点仍然知道尾随的零,如果格式化为文本,则可以显示尾随的零。

如果您始终知道小数点的最大数量(点后的数字)。那么最好的做法就是使用定点表示法。这将给你一个准确的结果,同时仍然工作得非常快

使用定点的最简单方式是简单地将数字存储在千分之一的整数中。例如,如果价格总是有2位小数,则可以节省美分(12.45美元存储在一个值为1245的整数中,因此表示1245美分)。使用四位小数,您将存储一万块(12.3456将存储在一个整数中,值123456表示123456万分之一),等等

这样做的缺点是,如果将两个值相乘,有时需要进行转换(
0.1*0.1=0.01
,而
1*1=1
,单位已从十分之一更改为百分之一)。如果你要使用其他的数学函数,你也必须考虑到这一点


另一方面,如果小数的数量变化很大,使用定点是一个坏主意。如果需要进行高精度浮点计算,则十进制数据类型的构造正是为了实现这一目的。

有一个关于它的解释。

你不应该在如此小的数字上使用双精度浮点计算时遇到问题。双精度大约等于15位有效数字,例如逗号后的10位数字,即使数值为千。我会检查你的代码,因为舍入误差等并不是用小数来修正的……虽然我同意你的结论,但你是否有证据支持你的说法“小数是专门用来赚钱的”?它对任何需要高精度的计算都有用吗?丹:我指的是