From 66841e2a53d6903fb3bb8a44a14f00677f75f2ea Mon Sep 17 00:00:00 2001 From: yoshi~ Date: Thu, 2 Jan 2025 17:21:20 +0100 Subject: [PATCH] improve precision --- CHANGELOG.md | 4 ++++ src/gleam/float.gleam | 12 ++++++++++-- test/gleam/float_test.gleam | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfc290db..60a4d6f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Improved the precision of `float.to_precision`. + ## v0.51.0 - 2024-12-22 - `dynamic/decode` now has its own error type. diff --git a/src/gleam/float.gleam b/src/gleam/float.gleam index 34dba054..6aeeac7b 100644 --- a/src/gleam/float.gleam +++ b/src/gleam/float.gleam @@ -261,8 +261,16 @@ pub fn truncate(x: Float) -> Int /// ``` /// pub fn to_precision(x: Float, precision: Int) -> Float { - let factor = do_power(10.0, do_to_float(-precision)) - do_to_float(round(x /. factor)) *. factor + case precision <= 0 { + True -> { + let factor = do_power(10.0, do_to_float(-precision)) + do_to_float(round(x /. factor)) *. factor + } + False -> { + let factor = do_power(10.0, do_to_float(precision)) + do_to_float(round(x *. factor)) /. factor + } + } } @external(erlang, "erlang", "float") diff --git a/test/gleam/float_test.gleam b/test/gleam/float_test.gleam index 1c8f96b3..6503a6b0 100644 --- a/test/gleam/float_test.gleam +++ b/test/gleam/float_test.gleam @@ -288,6 +288,12 @@ pub fn to_precision_test() { float.to_precision(435.3224, -0) |> should.equal(435.0) + + float.to_precision(184.20000000000002, 2) + |> should.equal(184.2) + + float.to_precision(12_345_678_912_345_678_912_345_678.0, -19) + |> should.equal(1_234_568.0e19) } pub fn min_test() {