Haskell练习:实现多类型货币到欧元的转换(拆分整数处理)
Haskell 货币转欧元实现方案
核心思路是用最小单位整数运算处理转换,完全避免浮点精度问题,同时不需要拼接/拆分函数,直接通过整数除法和取模得到欧元的元与分。
实现代码
data Euro = MkEuro Integer Integer data Dollar = MkDollar Integer Integer data Yen = MkYen Integer data Currency = MkE Euro | MkD Dollar | MkY Yen toEuro :: Currency -> Currency -- 欧元直接返回原实例 toEuro (MkE euro) = MkE euro -- 美元转欧元:先计算总美分数,再按汇率转成总欧分数,最后拆分元分 toEuro (MkD (MkDollar usDollars usCents)) = let totalUsCents = usDollars * 100 + usCents -- 1美元=0.9欧元 → 1美分=0.9欧分,用整数运算避免浮点误差 totalEuCents = totalUsCents * 9 `div` 10 euDollars = totalEuCents `div` 100 euCents = totalEuCents `mod` 100 in MkE (MkEuro euDollars euCents) -- 日元转欧元:需补充实际汇率,以下为示例逻辑 toEuro (MkY (MkYen yenAmount)) = let euroPerYen = 150 -- 示例:1欧元=150日元,替换为实际汇率 totalEuCents = yenAmount * 100 `div` euroPerYen euDollars = totalEuCents `div` 100 euCents = totalEuCents `mod` 100 in MkE (MkEuro euDollars euCents)
验证示例
你提到的12美元20分转换过程:
- 总美分:
12*100 + 20 = 1220 - 总欧分:
1220*9 ÷10 = 1098 - 拆分欧元:
1098 ÷100 =10(元),1098 %100=98(分)
最终得到MkE (MkEuro 10 98),完全符合预期。
关键说明
- 全程用整数运算,避免了浮点类型的精度丢失问题(比如0.9无法用二进制浮点数精确表示)
- 没有使用任何拼接/拆分字符串的函数,完全基于数值计算实现转换
内容的提问来源于stack exchange,提问作者user20543553
相关产品推荐
相关产品推荐

