I use Kotlin `1.3.11`
# announcements
t
I use Kotlin
1.3.11
c
1) Please use threads or edit original message when describing same issue. 2) Double is not suited for financial calculations, you cannot get precise numbers. See this answer here: https://stackoverflow.com/a/3730249/663012
t
1/ I apologise for that; 2/ It looks interesting, thank you. Somehow it reminded me something about fixed point.
I changed everything into
BigDecimal
but the result is still the same.
c
can you post a piece of code I can run to reproduce?
Unless whole JVM is horribly broken it should work 🙂
Note, I intentionally used your approach to make my code similar to yours, usually with BigDecimals you would write something like:
val totalHt = items.fold(BigDecimal.ZERO, BigDecimal::add)
t
Yes, exactly. Even the number are not correct. It should not be
4296.5999999999
but
4296.6
because I only have 1 item with
price = 0.6
and
quantity = 7161
Thanks for the tip, I use BigDecimal.ZERO 🙂
c
unless you start with a
Double
what you are describing should be impossible
I mean you're probably initializing
BigDecimal
with a
Double
, check this screenshot
t
This what's happening. I can't even use breakpoints correctly. You may have found something. But when I use my rounding function, it should work no?
c
No, it should not, there is no way for a double to represent something like a mathematical
0.6
precisely.
the nice rounded numbers you see during debugging is just eye candy.
Using floats or doubles for finance is like a mortal sin for a developer 😄 These types just are not designed to work like we need them to for financial stuff, for some other stuff too if you believe the military anecdote in this article: https://dzone.com/articles/never-use-float-and-double-for-monetary-calculatio
And here's more in-depth information from Oracle: https://blogs.oracle.com/corejavatechtips/the-need-for-bigdecimal (linked from the dzone article above)
t
Well I am lucky that it's not prod yet 😄 I am getting the value from a mongodb collection, and the values are numbers. That might be why my BigDecimal are acting like this.
Thanks a lot for you help. I think I have my solution.
👍 1
c
Yeah, with MongoDB you must use strings, it does not have dedicated decimal type beyond float/double
I don't know what you're using for mapping, but e.g. Spring Data MongoDB supports Java/Kotlin
BigDecimal
<-> BSON
String
mapping
Oh, actually it seems MongoDB 3.4 did add a suitable decimal type: https://docs.mongodb.com/manual/tutorial/model-monetary-data/#numeric-decimal Check if your mapper supports it, or use strings.
👍 1
t
By the way, how did you do to display the values on the side (from your screenshot)
s
That looks like maybe the output of a scratch file run in worksheet mode (i.e. using the big play button in the top left of the scratch editor)
👍 1
t
Well I converted everything into Decimals, it still not working... Even this dirty code like
Copy code
val totalTtc = decimalFormat.format((totalHt + (totalHt / 100) * invoice.taxPercent).toString().let {
                it.substring(0, it.indexOf(".") + 4)
            })
I am becoming crazy... I've added logging, they do not appear. I raised an exception in the middle of my code, to make crash my app on purpose, nothing happen, it's just continuing like if it was not there.
s
Are you rebuilding and actually running the newly built code?
t
When I do changes and click on the little bug, is it not supposed to rebuild?
s
Ahh I think I know what’s happening
hitting the button is launching a new debug session and you might be still interacting with an old one
t
Yep, you are right, I ran it using the terminal and it's now working 🙂
s
What version of IntelliJ are you running?
t
2018.3.2
s
they changed the default behavior from allowing sessions to run in parallel to disallowing that
oh huh
you might want to check in the run configuration to see if “Allow running in parallel” is enabled? Do you get a warning when you try to restart a debugging session?
t
It is not enabled