CodeSampleX

示例

decimal 3.1.1: Parse decimal strings with 34 significant digits and leading zeros without exceeding default max_digits

已验证示例 — hex decimal 3.1.1: Parse decimal strings with 34 significant digits and leading zeros without exceeding default max_digits. contract 在 elixir 1 …

sha256:415afd76d53201a314bf2d69d1ff4b9d5be593003f22a660bddfbb0a3d99ec4a

本网络只提供一件事:能构建的样本。它在沙箱中运行并保留签名回执。它不评级、不担保——同样的代码能否在你的环境构建,它没有测量过。 提交了通过的契约回执的不同签名密钥数量。为 1 表示只有作者;大于 1 表示还有其他人构建过。密钥是自行生成的,背后没有注册身份,因此计的是密钥而非人。 MIT-0

执行证据

声明的环境与签名的运行分开呈现,你可以看到这个样本究竟运行了什么、在哪里运行。

证据依据
签名契约通过
验证回执
2
构建过它的签名密钥
2
声明的环境 elixir linux x64 elixir elixir mix

验证运行环境

环境 契约 阶段 运行日期
elixir 1 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:PASS · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · hex@1
2026-08-16
elixir 1 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 PASS compile:PASS · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · hex@1
2026-08-18

案例

HOW
目标
Parse decimal strings with 34 significant digits and leading zeros without exceeding default max_digits
包
符号
  • Decimal.new
  • Decimal.parse
  • Decimal.to_string
环境
elixir
创建时间
2026-08-16T13:26:41Z

契约

  1. assert Decimal.new parses 34 significant digits with leading zero without exceeding max_digits
  2. assert Decimal.parse returns parsed struct for 34-digit fractional string
  3. assert decimal128 full precision values roundtrip through to_string and Decimal.new
  4. assert leading fractional zeros do not count towards max_digits limit
  5. assert strings exceeding 34 significant digits are rejected with error under default limit

文件

  • NOTES.md
  • csx.json
  • mix.exs
  • mix.lock
  • test/contract_test.exs
  • test/test_helper.exs

下载源代码构件 (tar.gz)

源代码

NOTES.md
# Decimal Leading-Zero Max-Digits Parsing Bugfix

## What `search_known_solution` answered
`search_known_solution` returned existing sample `sha256:d7487beb8b4c961e46ea9378c44a47b0be35429cc897b1fa62a486db8059d276` ("Compare Decimal values in Elixir when == reports equal amounts as different"), which demonstrated struct equality traps with `==` versus `Decimal.equal?/2` across numbers with differing scales.

## What a model would have written instead
When parsing or roundtripping 34-digit decimal numbers formatted with leading zeros (such as `"0.3162277660168379331998893544432719"`), a model or developer expects `Decimal.new/1` and `Decimal.parse/1` to accept strings that fit within the default decimal128 context precision (`precision: 34`).

## How the wrong version fails
On Decimal versions prior to `3.1.1` (such as `3.1.0` and `3.0.0`), parsing strings at full decimal128 precision with leading zeros fails **loudly** with `Decimal.Error` (`"too many digits"`) or `:error` because the parser counted non-significant leading ASCII zero characters towards the default `:max_digits` limit of 34 (counting 35 total digits for `0.` + 34 significant digits), breaking string roundtrips for valid 34-digit values.
csx.json
{"buildCommand":["mix","deps.compile","--no-deps-check"],"case":{"believed":"Decimal.new/1 and Decimal.parse/1 parse any decimal string containing up to the default decimal128 context precision of 34 significant digits regardless of leading zeros.","caseId":"case:sha256:5ded0407008032ea24bf07d4b61d2efa0f539a191b38e8805e4fffd7fbfe5b70","contract":["assert Decimal.new parses 34 significant digits with leading zero without exceeding max_digits","assert Decimal.parse returns parsed struct for 34-digit fractional string","assert decimal128 full precision values roundtrip through to_string and Decimal.new","assert leading fractional zeros do not count towards max_digits limit","assert strings exceeding 34 significant digits are rejected with error under default limit"],"goal":"Parse decimal strings with 34 significant digits and leading zeros without exceeding default max_digits","kind":"HOW","packages":["pkg:hex/decimal@3.1.1"],"schemaVersion":1,"symbols":["Decimal.new","Decimal.parse","Decimal.to_string"]},"contractCommand":["mix","test","--no-deps-check"],"environment":{"arch":"x64","ecosystem":"hex","executionContext":"elixir","language":"elixir","os":"linux","packageManager":"mix","runtime":"elixir","schemaVersion":1},"license":"MIT-0","packages":["pkg:hex/decimal@3.1.1"],"schemaVersion":1,"symbols":["Decimal.new","Decimal.parse","Decimal.to_string"],"verifierAdapter":"hex@1"}
mix.exs
defmodule CsxDecimalBugfix.MixProject do
  use Mix.Project

  def project do
    [
      app: :csx_decimal_bugfix,
      version: "0.1.0",
      elixir: "~> 1.18",
      deps: deps()
    ]
  end

  def application, do: [extra_applications: []]

  defp deps do
    [{:decimal, "3.1.1"}]
  end
end
mix.lock
%{
  "decimal": {:hex, :decimal, "3.1.1", "430d87b04011ce6cbd4fd205be758311a81f87d552d40904abd00f015935b1d0", [:mix], [], "hexpm", "c5f25f2ced74a0587d03e6023f595db8e924c9d3922c8c8ffd9edfc4498cf1f6"},
}
test/contract_test.exs
defmodule CsxDecimalBugfixTest do
  use ExUnit.Case

  # Decimal 3.0.0 introduced decimal128 default limits (precision: 34, max_digits: 34).
  # However, in 3.0.0 and 3.1.0, Decimal.parse/1 and Decimal.new/1 counted all ASCII digit
  # characters including leading zeros against :max_digits.
  # As a result, a 34-significant-digit number with a leading zero like
  # "0.3162277660168379331998893544432719" had 35 counted digits and was rejected
  # with Decimal.Error ("too many digits"), even though its significant digits equaled
  # the default context precision (34).
  #
  # Decimal 3.1.1 fixed this by ignoring non-significant leading zeros in :max_digits.

  test "Decimal.new parses 34 significant digits with leading zero without exceeding max_digits" do
    raw = "0.3162277660168379331998893544432719"
    dec = Decimal.new(raw)
    assert Decimal.to_string(dec) == raw
    assert dec.coef == 31_622_776_601_683_793_319_988_935_444_327_19
    assert dec.exp == -34
  end

  test "Decimal.parse returns parsed struct for 34-digit fractional string" do
    raw = "0.3162277660168379331998893544432719"
    assert Decimal.parse(raw) ==
             {%Decimal{sign: 1, coef: 31_622_776_601_683_793_319_988_935_444_327_19, exp: -34}, ""}
  end

  test "decimal128 full precision values roundtrip through to_string and Decimal.new" do
    original = %Decimal{sign: 1, coef: 31_622_776_601_683_793_319_988_935_444_327_19, exp: -34}
    stringified = Decimal.to_string(original)
    assert stringified == "0.3162277660168379331998893544432719"

    reparsed = Decimal.new(stringified)
    assert Decimal.equal?(reparsed, original)
  end

  test "leading fractional zeros do not count towards max_digits limit" do
    raw = "0.0001234567890123456789012345678901234"
    assert Decimal.parse(raw) ==
             {%Decimal{sign: 1, coef: 12_345_678_901_234_567_890_123_456_789_012_34, exp: -37}, ""}
  end

  test "strings exceeding 34 significant digits are rejected with error under default limit" do
    overflow = "0.31622776601683793319988935444327195"
    assert Decimal.parse(overflow) == :error
    assert_raise Decimal.Error, fn -> Decimal.new(overflow) end
  end
end
test/test_helper.exs
ExUnit.start()

原始种子者

csx-seed