# \[ANN\] A decimals lib like Java BigDecimal

**URL:** <https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284>\
**Category:** Package Announcements\
**Tags:** package\
**Created:** [October 25, 2019, 4:28am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284 "2019-10-25T04:28:29Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 25, 2019, 4:28am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/1 "2019-10-25T04:28:29Z")

</div>

> **[GitHub - gfZeng/Decimals.jl](https://github.com/gfZeng/Decimals.jl)**
>
> Contribute to gfZeng/Decimals.jl development by creating an account on GitHub.

---

<div class="post-metadata">

**Author:** ![StevenSiew](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevensiew/32/218393_2.png) [@StevenSiew](https://discourse.julialang.org/u/StevenSiew)\
**Post date:** [October 25, 2019, 4:44am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/2 "2019-10-25T04:44:34Z")

</div>

isaactsang, Are you and gfZeng, one and the same person?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [October 25, 2019, 5:19am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/3 "2019-10-25T05:19:25Z")

</div>

(I am assuming this is a package announcement, and changed the category accordingly)

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 25, 2019, 6:34am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/4 "2019-10-25T06:34:30Z")

</div>

Yeah, it’s me, both

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 25, 2019, 6:35am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/5 "2019-10-25T06:35:10Z")

</div>

thanks

---

<div class="post-metadata">

**Author:** ![laborg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/laborg/32/5474_2.png) [@laborg](https://discourse.julialang.org/u/laborg)\
**Post date:** [October 25, 2019, 7:32am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/6 "2019-10-25T07:32:28Z")

</div>

Could you explain the benefit of this package over using BigFloat or BigInt?

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 25, 2019, 8:15am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/7 "2019-10-25T08:15:39Z")

</div>

### The real infinite precision support

```julia
big"1.0" / big"3.0" 
=> 0.3333333333333333333333333333333333333333333333333333333333333333333333333333348

using Decimals
Decimals.setprecision!(precision=79)
d"1.0" / d"3.0"
=> Decimal(3333333333333333333333333333333333333333333333333333333333333333333333333333333, -79)

```

---

<div class="post-metadata">

**Author:** ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)\
**Post date:** [October 25, 2019, 12:30pm UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/8 "2019-10-25T12:30:01Z")

</div>

You will need to add an open-source license, such as MIT, for people to be able to use the package.

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 25, 2019, 3:34pm UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/9 "2019-10-25T15:34:19Z")

</div>

Thanks for your remind, I have added just now

---

<div class="post-metadata">

**Author:** ![oxinabox](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oxinabox/32/206603_2.png) [@oxinabox](https://discourse.julialang.org/u/oxinabox)\
**Post date:** [October 25, 2019, 9:45pm UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/10 "2019-10-25T21:45:40Z")

</div>

What are the Pros and Cons vs [GitHub - JuliaMath/Decimals.jl: Pure Julia decimal arithmetic library.](https://github.com/JuliaMath/Decimals.jl)  
And  
[GitHub - JuliaMath/FixedPointNumbers.jl: fixed point types for julia](https://github.com/JuliaMath/FixedPointNumbers.jl)

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 26, 2019, 12:24pm UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/11 "2019-10-26T12:24:05Z")

</div>

compares with [GitHub - JuliaMath/Decimals.jl: Pure Julia decimal arithmetic library.](https://github.com/JuliaMath/Decimals.jl)  
at [here](https://github.com/gfZeng/Decimals.jl#compares)

Well, I don’t know much about [GitHub - JuliaMath/FixedPointNumbers.jl: fixed point types for julia](https://github.com/JuliaMath/FixedPointNumbers.jl)

---

<div class="post-metadata">

**Author:** ![zdenek\_hurak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zdenek_hurak/32/53118_2.png) [@zdenek\_hurak](https://discourse.julialang.org/u/zdenek_hurak)\
**Post date:** [October 26, 2019, 1:58pm UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/12 "2019-10-26T13:58:20Z")

</div>

Well, the only comparison with `Decimals.jl` that you give at the referenced link is that your implementation is simpler and the use is more friendly. Now that you made such statement, could you be a bit more specific? In which aspect is your implementation simpler? And in which situations is the use more friendly? Perhaps examples might help.

You may also want to take an inspiration from a comparision displayed on the `Decimals.jl` page: [https://github.com/JuliaMath/Decimals.jl#comparison-with-other-packages](https://github.com/JuliaMath/Decimals.jl#comparison-with-other-packages)

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 26, 2019, 2:43pm UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/13 "2019-10-26T14:43:12Z")

</div>

The code is simple enough, best docs is code. 🙂

---

<div class="post-metadata">

**Author:** ![longemen3000](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/longemen3000/32/7298_2.png) [@longemen3000](https://discourse.julialang.org/u/longemen3000)\
**Post date:** [October 27, 2019, 12:08am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/14 "2019-10-27T00:08:33Z")

</div>

yeah,it is, the idea of a string macro is very good. with that said, as i saw a lot of times with number packages, a speed comparison would be very good. the main difference i saw is that the JuliaMath Decimals.jl uses the following struct:

```julia
struct Decimal <: AbstractFloat
        s::Integer # sign can be 0 (+) or 1 (-)
        c::BigInt # coefficient (significand), must be non-negative
        q::Integer # exponent
end

```

your decimal uses:

```julia
struct Decimal <: AbstractFloat
    c::BigInt # coefficient
    q::Integer # exponent
end

```

a glaring fault is the absence of compatibility with other number types. (for example,` 1+d"3.0"`)

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 27, 2019, 2:25am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/15 "2019-10-27T02:25:15Z")

</div>

> [@longemen3000](#):
>
> example

1+d"3.0" should be working, you can try again

---

<div class="post-metadata">

**Author:** ![StevenSiew](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevensiew/32/218393_2.png) [@StevenSiew](https://discourse.julialang.org/u/StevenSiew)\
**Post date:** [October 27, 2019, 4:54am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/16 "2019-10-27T04:54:26Z")

</div>

Isaactsang,

I take great offense that your implementation is simpler and the use is more friendly.

Let me give you an example of my PDFPs.jl which is more simpler and more friendly

[ENTER SARCASM MODE]

```julia
julia> using PDFPs

julia> s = PDFP_toCommonString
PDFP_toCommonString (generic function with 1 method)

"Now using 4 digit precision via format of PDFP(number,4)";

julia> A=PDFP("7.0",4); B=PDFP(pi,4); C=A+B; s(C)
"10.14"

"Now using the simpler and more friendlier 0 digit precision";

julia> A=PDFP("7.0",0); B=PDFP(pi,0); C=A+B; s(C)
""

julia> show(C)
PDFP(0, 0, [])

```

Any number can be represented by my 0 digit precision PDFP and the result is also a 0 digit precision PDFP. NOTHING could be simpler or more friendly to use. In fact my 0 digit precision PDFP is the fastest decimal floating point number system in the world because it can give you the result before you even started the calculation!!! It is also 100% foolproof because it is absolutely impossible to get the wrong result.

[LEAVE SARCASM MODE]

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 27, 2019, 5:28am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/17 "2019-10-27T05:28:35Z")

</div>

> [@StevenSiew](#):
>
> SARCASM

Well, we should be considering what features we use most.

You can write a simple function to achieve your case, or just use `setexponent(d, 0, RoundDown)`

---

<div class="post-metadata">

**Author:** ![isaactsang](https://avatars.discourse-cdn.com/v4/letter/i/54ee81/32.png) [@isaactsang](https://discourse.julialang.org/u/isaactsang)\
**Post date:** [October 27, 2019, 11:31am UTC](https://discourse.julialang.org/t/ann-a-decimals-lib-like-java-bigdecimal/30284/19 "2019-10-27T11:31:06Z")

</div>

[https://github.com/gfZeng/Decimals.jl/commit/2783c62e2544ca28c1321894e41d6b597f93a7f4](https://github.com/gfZeng/Decimals.jl/commit/2783c62e2544ca28c1321894e41d6b597f93a7f4)
