如何决定使用什么-双精度还是十进制? [重复]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

        每当您要处理(希望)以10为基数精确表示的数量时,请使用十进制。这包括货币值,因为您希望将2.1234精确表示为2.1234。 当您不需要以10为基数的精确表示形式时,请使用double。通常,这对于处理测量值很有好处,因为这些已经是近似值,而不是精确的数量。 当然,如果对您而言不重要的是,以10为基数的确切表示形式并不重要,则可以考虑其他因素,具体取决于特定情况,这些因素可能无关紧要: double的范围更大(它可以处理非常大和非常小的幅度); 十进制具有更高的精度(具有更多有效数字); 您可能需要使用double来与一些不知道十进制的旧API进行交互; double比十进制快; 十进制具有更大的内存占用量;     ,        当需要精度且很重要时,请使用
decimal
。 如果精度不那么重要,则可以使用
double
。 在您的情况下,您应该使用
decimal
作为其财务事项。     ,        对于财务操作,我始终使用十进制类型     ,        使用ѭ0来表示10口幂(即价格)。     ,        小数是处理价格时要走的路。     ,        如果是财务软件,则应使用小数。这篇Wiki文章总结得很好。     ,        在此示例中,一个简单的响应是:
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
使用double进行的测试失败,因为其二进制表示形式(以2为底)中的0.3是周期性的,因此您放宽了精度,十进制以BCD表示,因此以10为底,并且您没有意外丢失有效数字。不幸的是,小数比双精度慢。通常我们使用十进制进行财务计算,其中必须考虑任何数字以避免公差,而对于工程则使用双精度/浮点型。     ,        Double是通用的浮点数据类型,十进制专门用于货币和金融领域。即使双精度通常可以正常工作,但在某些情况下,十进制小数也可能会防止出现问题(例如,达到十亿美元的值时会舍入错误)     ,        在MSDN上有一个移植     ,        一旦开始对双精度进行计算,您可能会遇到意想不到的舍入问题,因为双精度使用数字的二进制表示形式,而十进制使用保留十进制数字的十进制表示形式。那可能就是您正在经历的。如果只对文本或数据库的双精度序列进行序列化和反序列化而不进行舍入,则实际上不会失去任何精度。 但是,在您关心十进制数字(而不是double在内部使用的二进制数字)的情况下,十进制更适合表示货币值。但是,如果您需要进行复杂的计算(例如精算计算中使用的积分),则必须在进行计算之前将十进制转换为双精度,从而抵消了使用十进制的优势。 小数也“记住”它有多少位数,例如即使十进制1.230等于1.23,第一个仍然知道尾随零,并且如果将其格式化为文本,则可以显示它。     ,如果您始终知道小数位数的最大值(点之后的数字)。然后,最佳实践是使用定点表示法。这将为您提供准确的结果,同时仍然可以非常快速地工作。 使用定点的最简单方法是将数字简单地存储为一千个整数。例如,如果价格始终有2个小数,您将节省美分(12.45美元存储在一个int中,其值为1245,因此代表1245美分)。用四个小数表示,您将存储一万(12.3456将存储在一个int中,其值123456代表123456的一万分之一),依此类推。 这样做的缺点是,例如将两个值相乘(multiply5ѭ,而
1 * 1 = 1
,单位从十分之一变为百分之一),则有时需要转换。而且,如果您要使用其他一些数学函数,则还必须考虑类似这样的事情。 另一方面,如果小数位数使用固定点变化很大,则不建议这样做。而且,如果需要高精度浮点计算,则正是出于该目的构造了十进制数据类型。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...