考虑这个功能:
function DollarsToCents(dollars: Currency): Integer;
begin
result := Trunc(dollars * 100);
end;
表达式
dollars * 100
将被转换为Extended
,我相信,这是一种二进制浮点类型,并且作为一般规则,由于“表示错误”的可能性,金钱不应该放入二进制浮点类型。
所以,我的问题是:这段代码安全吗?在我们的例子中,我们没有小数美分,函数的典型输入可能类似于
1.23
。
或者有更好的方法吗?
“货币”在内部是一个以 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 位整数进行访问。