Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.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
Types 为什么不';t应用程序通常使用int在内部表示货币值?_Types_Currency - Fatal编程技术网

Types 为什么不';t应用程序通常使用int在内部表示货币值?

Types 为什么不';t应用程序通常使用int在内部表示货币值?,types,currency,Types,Currency,为什么应用程序通常不使用整数数据类型(例如C++/Java/C#中的int或long)来在内部表示货币值,而不是使用浮点数据类型(float,double)或类似Java的bigdecimic)之类的数据类型 例如,如果我正在编写一个Java应用程序,我有一个变量,我想用美元表示一个实际值(不需要表示分币的分数),我可以声明一个表示分币数的int值。例如,“1.00美元”的值将表示为100。这似乎是使用double(参见问题)或BigDecimal(这是一个比简单的原语int更重的对象)的一个很

为什么应用程序通常不使用整数数据类型(例如C++/Java/C#中的
int
long
)来在内部表示货币值,而不是使用浮点数据类型(
float
double
)或类似Java的
bigdecimic
)之类的数据类型

例如,如果我正在编写一个Java应用程序,我有一个变量,我想用美元表示一个实际值(不需要表示分币的分数),我可以声明一个表示分币数的
int
值。例如,“1.00美元”的值将表示为100。这似乎是使用
double
(参见问题)或
BigDecimal
(这是一个比简单的原语
int
更重的对象)的一个很好的替代方法

显然,在向用户显示整数值之前,或在用户输入货币值时,需要将整数值“转换”(即从100转换为“$1”或“$1.00”),但这样做似乎并不比格式化用于显示的
double
BigDecimal
更麻烦

为什么在不需要表示美分分数(或其他货币类型中的等值)的应用程序中,这种方法不是一种最佳做法?

整数类型 使用大多数整数数据类型来表示货币是个坏主意,因为:

  • 对于普通应用而言,非常有限的可表示值范围
  • 在处理分数值时施加额外负担
具体来说,有限的值范围对于较短的整数类型可能是一个严重的问题。让我们考虑一个常见的32位有符号整数(通常是<代码> int /代码>):

  • 价值范围约为-21.5亿至+21.5亿-这本身不是任何会计/银行/严肃金融用途的选项
  • 当仅使用最后两位数字表示小数部分时,范围缩小到-2150万到+2150万
  • 如果乘法有效(不说混合精度计算),则范围将进一步缩小
使用64位有符号整数(通常是
长的
)可以计算多达92000万亿。当考虑到全球经济时,货币是以万亿计的——因此这不是一个合理的选择

浮点类型 使用浮点数据类型是个坏主意,因为它们本质上是不精确的,这是绝大多数货币计算的致命问题

合适的数据类型 使用定点或十进制数据类型是一个非常好的主意,因为它们通常没有浮点和整数数据类型的负属性:

  • 代表值范围足够宽
  • 精度可根据计算要求通过四舍五入进行调整
  • 由于自然分数值处理,因此不会产生混淆
  • 精确的十进制数表示法
最后但并非最不重要的一点是,合适的数据类型在很大程度上取决于语言及其功能

其他问题 此外,在许多计算场景中,中间计算和结果值需要使用不同的精度。虽然结果通常必须以相应法律规定的特定货币精度表示,但中间计算可能涉及更高精度的中间结果。例如,贷款支付、保险成本等的百分比计算,或汇率经常以更高精度给出的货币换算


多货币软件还需要处理不同货币具有不同法定精度的事实。四舍五入可能是由会计准则规定的。

我认为gnucash使用了一种理性表示,存储了分子和分母。我没有数据来说明什么是最佳或常见的做法。浮点运算的优点是方便,缺点是不精确。就个人而言,我不会使用浮点。

为什么应用程序通常不使用[整数]在内部表示货币值?

  • 它不利于简单的编码$1.10换算为110°。好的,但是当你需要计算税收的时候呢(比如1.10美元*4.225%——密苏里州的税率是0.046475美元)。为了使所有的钱都是整数,你还必须将销售税转换为整数(4225),这需要将110美分进一步转换为11000000。然后,数学可以是11000000*4225/100000=464750。这是一个问题,因为现在我们有分数的值(分别为11000000和464750)。所有这些都是为了把钱储存成整数

  • 因此,用本国货币来思考和编写代码更容易。在美国,这将以美元为单位,美分为小数点(即1.10美元)。用110美分来编码这样的代码就不那么自然了。使用以10为基数的浮点数(如Java的
    BigDecimal
    和.NET的
    Decimal
    )通常对货币值足够精确(相比之下,以2为基数的浮点数,如
    Float
    Double

  • 对于不需要表示美分分数(或其他货币类型中的等值)的应用程序,为什么这种方法不是一种最佳做法?


    我认为上面的数字1表明,至少在计算销售税时,很难不需要表示美分的分数,这在商业应用程序中很常见。

    或者,也许更好:为什么应用程序不使用专门为处理货币单位而设计的数据类型