将货币金额转换为美分,无需经过浮点数

问题描述 投票:0回答:1

考虑这个功能:

function DollarsToCents(dollars: Currency): Integer;
begin
  result := Trunc(dollars * 100);
end;

表达式

dollars * 100
将被转换为
Extended
,我相信,这是一种二进制浮点类型,并且作为一般规则,由于“表示错误”的可能性,金钱不应该放入二进制浮点类型。

所以,我的问题是:这段代码安全吗?在我们的例子中,我们没有小数美分,函数的典型输入可能类似于

1.23

或者有更好的方法吗?

delphi double
1个回答
1
投票

“货币”在内部是一个以 0.01 美分为单位表示的 64 位整数,因此 1.00 美元 = 10000 个“货币”,因此利用这些知识,您可以这样做:

function DollarsToCents(dollars: currency): integer;
  var 
    I64 : Int64 ABSOLUTE dollars;

  begin
    Result:=I64 DIV 100;
  end;

ABSOLUTE 关键字将 I64 变量覆盖在美元参数之上,因此您可以将其作为底层 64 位整数进行访问。

© www.soinside.com 2019 - 2024. All rights reserved.