Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify double/lossiness handling #646

Open
raiju opened this issue Jul 13, 2020 · 2 comments
Open

Clarify double/lossiness handling #646

raiju opened this issue Jul 13, 2020 · 2 comments

Comments

@raiju
Copy link
Contributor

raiju commented Jul 13, 2020

What happened?

Doubles in conjure-java failed for some numbers that should've been supported: palantir/conjure-java#1006. While discussing the fix we realized we haven't defined how we expect conjure to handle doubles, specifically around lossiness in deserialization.

What did you want to happen?

The following questions should be answered:

  1. Should the deserialization behavior of an integral JSON number (\d+) be identical to a floating point JSON number w/ a zero decimal value (\d+\.0)? E.g. should 9007199254740993 result in the same behavior as 9007199254740993.0?
  2. Are any "losses" acceptable? Examples (received value, returned value)
  • 9007199254740993 -> 9007199254740992.0
  • 9007199254740993.0 -> 9007199254740992.0
  • 9007199254740992.1 -> 9007199254740992.0
  • 0.30000000000000004 -> 0.30000000000000004
  • 0.30000000000000003 -> 0.30000000000000004
  • 0.30000000000000002 -> 0.30000000000000004
  • 0.30000000000000001 -> 0.3

Note that these results are a bit misleading. Floating points technically don't actually describe a single value, but a range (e.g. 0.3 is actually 0.29999999999999996... - 0.30000000000000001..., the center point is ~ 0.29999999999999998; when a double gets printed, it'll emit the number in that range with the shortest decimal representation; this is also the cause of the classic 0.1 + 0.2 = 0.30000000000000004).

@raiju
Copy link
Contributor Author

raiju commented Jul 13, 2020

My proposal is to:

  1. Treat \d+\.0 and \d+ identically (i.e. do not special-case integral inputs)
  2. Treat doubles as lossy/imprecise. If exact transferring of numbers is required, integer, long or decimal types should be used.

@raiju
Copy link
Contributor Author

raiju commented Jul 13, 2020

@carterkozak @markelliot (as you both had opinions on the conjure-java PR)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant