paupino / rust-decimal

Decimal number implementation written in pure Rust suitable for financial and fixed-precision calculations.
https://docs.rs/rust_decimal/
MIT License
972 stars 177 forks source link

Fixes issue whereby scale 29 is required however is optimized away #619

Closed paupino closed 10 months ago

paupino commented 10 months ago

Fixes #618

Fixes an issue during add/subtract with a small number with scale 29. Effectively, what happened is that the number was able to be "aligned" within a 32 bit boundary however because it used scale 29 it was "optimized" away when reconstructing the decimal.

Scale 30, even though invalid, was ok since it continued scaling back until it reached a scale of 28. Scale 29 however effectively stopped scaling and was forced to 28 during reconstruction. This fix forces scale 29 to also be scaled down to scale 28 before reconstruction. The alternative solution would be to retain a scale of 29 however that could lead to subtly incorrect values (i.e. -0.09999999999999999999999999990 with the trailing zero). Since the decimal library constrains scale to 0 to 28 in most cases (rescaling is the exception) it makes sense to continue scaling to 28 during these calculations.