You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:35:28