Have you performed simple arithmetic operations like 0.1 + 0.2? You might have gotten something strange: 0.1 + 0.2 = 0.30000000000000004.

  • luciole (he/him)@beehaw.org
    link
    fedilink
    arrow-up
    18
    ·
    4 days ago

    Floating-point arithmetic is important to understand at least vaguely since it’s a pretty leaky abstraction. Fortunately, we don’t need a “✨Member-only story” on Medium to get acquainted with the underlying concepts.

  • karlhungus@lemmy.ca
    link
    fedilink
    arrow-up
    9
    ·
    4 days ago

    Ugh, i thought this was a question, not a link. So i spent time googling for a good tutorial on floats (because I didn’t click the link)…

    Now i hate myself, and this post.

  • RagingHungryPanda@lemm.ee
    link
    fedilink
    arrow-up
    8
    ·
    4 days ago

    It’s how CPUs do floating point calculations. It’s not just javascript. Long story short, a float is stored in the format of one bit for the +/-, some bits for a base value (mantissa), and some bits for the exponent. As a result, some numbers aren’t quite representable exactly.

  • Zagorath@aussie.zone
    link
    fedilink
    arrow-up
    3
    ·
    4 days ago

    A good way to think of it is to compare something similar in decimal. .1 and .2 are precise values in decimal, but can’t be represented as perfectly in binary. 1/3 might be a pretty good similar-enough example. With a lack of precision, that might become 0.33333333, which when added in the expression 1/3 + 1/3 + 1/3 will give you 0.99999999, instead of the correct answer of 1.

  • thingsiplay@beehaw.org
    link
    fedilink
    arrow-up
    1
    ·
    4 days ago

    If you are adding 0.1 + 0.2, then it means you can cut off anything after the first digit (after the dot off course). Because the rest of the 0.1 is only 0 and the rest of 0.2 is 0. That can help with rounding errors on floating point calculations. I don’t program JavaScript, so no idea what the best way to go about it would be.

      • thingsiplay@beehaw.org
        link
        fedilink
        arrow-up
        2
        arrow-down
        1
        ·
        4 days ago

        I don’t have much JavaScript experience, but maybe .toFixed() will help here. Playground (copy the below code to the playground to test): https://playcode.io/javascript

        const number = 0.1 + 0.2
        const fixed = number.toFixed(3)
        
        // Update header text
        document.querySelector('#header').innerHTML = message
        
        // Log to console
        console.log(number)
        console.log(fixed)
        

        outputs:

        0.30000000000000004
        0.300
        
  • aubeynarf@lemmynsfw.com
    link
    fedilink
    arrow-up
    2
    arrow-down
    1
    ·
    edit-2
    4 days ago

    JavaScript is truly a bizarre language - we don’t need to go as far as arbitrary-precision decimal, it does not even feature integers.

    I have to wonder why it ever makes the cut as a backend language.

    • luciole (he/him)@beehaw.org
      link
      fedilink
      arrow-up
      1
      ·
      3 days ago

      The JavaScript Number type is implemented as an IEEE 754 double and as such any integer between -253 and 253 are represented without loss of precision. I can’t say I’ve ever missed explicitly declaring a value as an integer in JS. It’s dynamically typed anyways. There’s the languages people complain about and the ones nobody uses.

      • aubeynarf@lemmynsfw.com
        link
        fedilink
        arrow-up
        1
        ·
        3 days ago

        And then JSON doesn’t restrict numbers to any range or precision; and at least when I deal with JSON values, I feel the need to represent them as a BigDecimal or similar arbitrary precision type to ensure I am not losing information.

        • luciole (he/him)@beehaw.org
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          3 days ago

          I hope you work in a field where worrying about your integers hitting larger values than 9 quadrillion is justified.

          • aubeynarf@lemmynsfw.com
            link
            fedilink
            arrow-up
            3
            ·
            edit-2
            3 days ago

            Could be a crypto key, or a randomly distributed 64-bit database row ID, or a memory offset in a stack dump of a 64 bit program