浏览代码

fix floating point precision problem

Valentin Le Tallec 1 年之前
父节点
当前提交
89a141b640
共有 2 个文件被更改,包括 4 次插入3 次删除
  1. 1 0
      examples/tests/human.nbt
  2. 3 3
      numbat/modules/datetime/human.nbt

+ 1 - 0
examples/tests/human.nbt

@@ -20,6 +20,7 @@ assert_eq((1 day            -> human), "1 day")
 assert_eq((1.37 day         -> human), "1 day + 8 hours + 52 minutes + 48 seconds")
 assert_eq((1.37 day         -> human), "1 day + 8 hours + 52 minutes + 48 seconds")
 
 
 assert_eq((1 week           -> human), "7 days")
 assert_eq((1 week           -> human), "7 days")
+assert_eq((1.5 weeks        -> human), "10 days + 12 hours")
 assert_eq((2 weeks          -> human), "14 days")
 assert_eq((2 weeks          -> human), "14 days")
 assert_eq((2.5 weeks        -> human), "17 days + 12 hours")
 assert_eq((2.5 weeks        -> human), "17 days + 12 hours")
 
 

+ 3 - 3
numbat/modules/datetime/human.nbt

@@ -26,11 +26,11 @@ fn _precise_human_seconds(time: Time) -> String = "{(time -> seconds) /  second}
 
 
 fn _human_recurse(t: Time, result: String, time_unit: String) -> String =
 fn _human_recurse(t: Time, result: String, time_unit: String) -> String =
   if time_unit == "day"
   if time_unit == "day"
-    then _human_recurse(t - (t |> floor_in(day)), _human_join(result, t -> _human_days),    "hour")
+    then _human_recurse((t -> day) - (t |> floor_in(day)), _human_join(result, t -> _human_days),    "hour")
   else if time_unit == "hour"
   else if time_unit == "hour"
-    then _human_recurse(t - (t |> floor_in(hour)), _human_join(result, t -> _human_hours),   "minute")
+    then _human_recurse((t -> hour) - (t |> floor_in(hour)), _human_join(result, t -> _human_hours),   "minute")
   else if time_unit == "minute"
   else if time_unit == "minute"
-    then _human_recurse(t - (t |> floor_in(min)), _human_join(result, t -> _human_minutes), "second")
+    then _human_recurse((t -> min) - (t |> floor_in(min)), _human_join(result, t -> _human_minutes), "second")
   else _human_join(result, (t |> round_in(ms)) -> _precise_human_seconds)
   else _human_join(result, (t |> round_in(ms)) -> _precise_human_seconds)
 
 
 fn _year_month_approx(t: Time) -> String = _human_join(the_years -> _human_years, t - the_years -> _human_months)
 fn _year_month_approx(t: Time) -> String = _human_join(the_years -> _human_years, t - the_years -> _human_months)