如何在 Ada 中实现货币类型?

How to Implement an Money Type in Ada?

我尝试用ada2wsdl转换以下Ada代码包

package Bank is
   
   type Money is new Float; -- works
   type Money is delta 0.01 digits 15; -- dont work
  
end Bank;

命令行工具给出以下输出

ada2wsdl: unsupported element kind Money

我应该如何在 Ada 中实现货币类型?
那是正确的吗?

因为XML模式没有fixed-point或binary-coded十进制(BCD)类型,在xsd:命名空间中,ada2wsdl被设计为目标xsd 类型作为 1st-class 公民和从中派生的相应 Ada 类型。永远不要将浮点数用于货币,因为浮点数在 least-significant 数字中可能不精确,而对于大量货币来说,预计精确到最后的 0.01 货币单位。 XML Schema 中最接近 Ada 的 fixed-point 类型的模拟是 WWW UI 中的字符串,通过 ada2wsdl 作为字符串传递给 Ada,然后在 Ada 代码中转换为 Ada 的 fixed-point类型。

此外(尤其是对于银行),Money 类型应始终包含一个伴随的货币单位以及作为 Ada 记录的 fixed-point 数字。

package Bank is
   type IdMonetaryUnit is (EUR, GBP, RUB, USD);
   type StrMoney is String(1..15); -- Use this in wsdl with radix-point implicitly implied at 0000000000000.00 for "000000000000000".
   type Money is
       record
           Value  : delta 0.01 digits 15;
           IdUnit : IdMonetaryUnit;
       end record;
end Bank;

对于银行,我会建议超过 15 位数字。考虑到银行业使用的所有货币单位,我认为 18 是现实世界中的最低限度;当然,某些 ISO 或 banking-industry 标准会指定实际使用的最小字段大小。

type Money is delta 0.01 digits 18;

Result: 36553462709287.80 EUR -> ok
Result: 18287169236628.28 EUR -> ok
Result: 12193767453669.50 EUR -> ok
Result:  9146196324860.35 EUR -> ok
Result:  7317375076173.70 EUR -> ok
Result:  6098044816860.81 EUR -> ok
Result:  5227037762542.62 EUR -> ok
Result:  4573751368852.46 EUR -> ok
Result:  4065621296766.90 EUR -> ok
Result:  3659105626024.01 EUR -> ok
php7 float

Result: 36553462709288.00 EUR -> false
Result: 18287169236628.00 EUR -> false
Result: 12193767453670.00 EUR -> false
Result:  9146196324860.40 EUR -> false
Result:  7317375076173.70 EUR -> ok
Result:  6098044816860.80 EUR -> false
Result:  5227037762542.60 EUR -> false
Result:  4573751368852.50 EUR -> false
Result:  4065621296766.90 EUR -> ok
Result:  3659105626024.00 EUR -> false