Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. A wonder of double convert to integer

A wonder of double convert to integer

Scheduled Pinned Locked Moved C#
question
8 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Libra
    wrote on last edited by
    #1

    See the FunA() and FunB() result, why any diffent? private void FunA() { double value; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for( **value = 2.1;** value >= -1.1; value -= 0.1 ) sb.AppendFormat("Ceiling({0:f})={1} Floor({0:f})={2} Round({0:f})={3} (int)({0:f}+0.5)={4} Truncate({0:f})={5}\n", value, Math.Ceiling(value), Math.Floor(value), Math.Round(value), (int)(value+0.5), Decimal.Truncate(Convert.ToDecimal(value))); return sb.ToString(); } private string FunB() { double value; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for( **value = 5.1;** value >= -1.1; value -= 0.1 ) sb.AppendFormat("Ceiling({0:f})={1} Floor({0:f})={2} Round({0:f})={3} (int)({0:f}+0.5)={4} Truncate({0:f})={5}\n", value, Math.Ceiling(value), Math.Floor(value), Math.Round(value), (int)(value+0.5), Decimal.Truncate(Convert.ToDecimal(value))); return sb.ToString(); } Reuslts is: FunA(): Ceiling(2.10)=3 Floor(2.10)=2 Round(2.10)=2 (int)(2.10+0.5)=2 Truncate(2.10)=2 Ceiling(2.00)=2 Floor(2.00)=2 Round(2.00)=2 (int)(2.00+0.5)=2 Truncate(2.00)=2 Ceiling(1.90)=2 Floor(1.90)=1 Round(1.90)=2 (int)(1.90+0.5)=2 Truncate(1.90)=1 Ceiling(1.80)=2 Floor(1.80)=1 Round(1.80)=2 (int)(1.80+0.5)=2 Truncate(1.80)=1 Ceiling(1.70)=2 Floor(1.70)=1 Round(1.70)=2 (int)(1.70+0.5)=2 Truncate(1.70)=1 Ceiling(1.60)=2 Floor(1.60)=1 Round(1.60)=2 (int)(1.60+0.5)=2 Truncate(1.60)=1 Ceiling(1.50)=2 Floor(1.50)=1 Round(1.50)=1 (int)(1.50+0.5)=1 Truncate(1.50)=1 Ceiling(1.40)=2 Floor(1.40)=1 Round(1.40)=1 (int)(1.40+0.5)=1 Truncate(1.40)=1 Ceiling(1.30)=2 Floor(1.30)=1 Round(1.30)=1 (int)(1.30+0.5)=1 Truncate(1.30)=1 Ceiling(1.20)=2 Floor(1.20)=1 Round(1.20)=1 (int)(1.20+0.5)=1 Truncate(1.20)=1 Ceiling(1.10)=2 Floor(1.10)=1 Round(1.10)=1 (int)(1.10+0.5)=1 Truncate(1.10)=1 Ceiling(1.00)=1 Floor(1.00)=0 Round(1.00)=1 (int)(1.00+0.5)=1 Truncate(1.00)=0 Ceiling(0.90)=1 Floor(0.90)=0 Round(0.90)=1 (int)(0.90+0.5)=1 Truncate(0.90)=0 Ceiling(0.80)=1 Floor(0.80)=0 Round(0.80)=1 (int)(0.80+0.5)=1 Truncate(0.80)=0 Ceiling(0.70)=1 Floor(0.70)=0 Round(0.70)=1 (int)(0.70+0.5)=1 Truncate(0.70)=0 Ceiling(0.60)=1 Floor(0.60)=0 Round(0.60)=1 (int)(0.60+0.5)=1 Truncate(0.60)=0 Ceiling(0.50)=1 Floor(0.50)=0 Round(0.50)=0 (int)(0.50+0.5)=0 Truncate(0.50)=0 Ceiling(0.40)=1 Floor(0.40)=0 Round(0.40)=0 (int)(0.40+0.5)=0 Truncate(0.40)=0 Ceiling(0.30)=1 Floor(0.3

    C G 2 Replies Last reply
    0
    • L Libra

      See the FunA() and FunB() result, why any diffent? private void FunA() { double value; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for( **value = 2.1;** value >= -1.1; value -= 0.1 ) sb.AppendFormat("Ceiling({0:f})={1} Floor({0:f})={2} Round({0:f})={3} (int)({0:f}+0.5)={4} Truncate({0:f})={5}\n", value, Math.Ceiling(value), Math.Floor(value), Math.Round(value), (int)(value+0.5), Decimal.Truncate(Convert.ToDecimal(value))); return sb.ToString(); } private string FunB() { double value; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for( **value = 5.1;** value >= -1.1; value -= 0.1 ) sb.AppendFormat("Ceiling({0:f})={1} Floor({0:f})={2} Round({0:f})={3} (int)({0:f}+0.5)={4} Truncate({0:f})={5}\n", value, Math.Ceiling(value), Math.Floor(value), Math.Round(value), (int)(value+0.5), Decimal.Truncate(Convert.ToDecimal(value))); return sb.ToString(); } Reuslts is: FunA(): Ceiling(2.10)=3 Floor(2.10)=2 Round(2.10)=2 (int)(2.10+0.5)=2 Truncate(2.10)=2 Ceiling(2.00)=2 Floor(2.00)=2 Round(2.00)=2 (int)(2.00+0.5)=2 Truncate(2.00)=2 Ceiling(1.90)=2 Floor(1.90)=1 Round(1.90)=2 (int)(1.90+0.5)=2 Truncate(1.90)=1 Ceiling(1.80)=2 Floor(1.80)=1 Round(1.80)=2 (int)(1.80+0.5)=2 Truncate(1.80)=1 Ceiling(1.70)=2 Floor(1.70)=1 Round(1.70)=2 (int)(1.70+0.5)=2 Truncate(1.70)=1 Ceiling(1.60)=2 Floor(1.60)=1 Round(1.60)=2 (int)(1.60+0.5)=2 Truncate(1.60)=1 Ceiling(1.50)=2 Floor(1.50)=1 Round(1.50)=1 (int)(1.50+0.5)=1 Truncate(1.50)=1 Ceiling(1.40)=2 Floor(1.40)=1 Round(1.40)=1 (int)(1.40+0.5)=1 Truncate(1.40)=1 Ceiling(1.30)=2 Floor(1.30)=1 Round(1.30)=1 (int)(1.30+0.5)=1 Truncate(1.30)=1 Ceiling(1.20)=2 Floor(1.20)=1 Round(1.20)=1 (int)(1.20+0.5)=1 Truncate(1.20)=1 Ceiling(1.10)=2 Floor(1.10)=1 Round(1.10)=1 (int)(1.10+0.5)=1 Truncate(1.10)=1 Ceiling(1.00)=1 Floor(1.00)=0 Round(1.00)=1 (int)(1.00+0.5)=1 Truncate(1.00)=0 Ceiling(0.90)=1 Floor(0.90)=0 Round(0.90)=1 (int)(0.90+0.5)=1 Truncate(0.90)=0 Ceiling(0.80)=1 Floor(0.80)=0 Round(0.80)=1 (int)(0.80+0.5)=1 Truncate(0.80)=0 Ceiling(0.70)=1 Floor(0.70)=0 Round(0.70)=1 (int)(0.70+0.5)=1 Truncate(0.70)=0 Ceiling(0.60)=1 Floor(0.60)=0 Round(0.60)=1 (int)(0.60+0.5)=1 Truncate(0.60)=0 Ceiling(0.50)=1 Floor(0.50)=0 Round(0.50)=0 (int)(0.50+0.5)=0 Truncate(0.50)=0 Ceiling(0.40)=1 Floor(0.40)=0 Round(0.40)=0 (int)(0.40+0.5)=0 Truncate(0.40)=0 Ceiling(0.30)=1 Floor(0.3

      C Offline
      C Offline
      Christian Graus
      wrote on last edited by
      #2

      Use double or Decimal, they are more precise. Christian Graus - Microsoft MVP - C++

      L 1 Reply Last reply
      0
      • C Christian Graus

        Use double or Decimal, they are more precise. Christian Graus - Microsoft MVP - C++

        L Offline
        L Offline
        Libra
        wrote on last edited by
        #3

        It already is double! === Game is power! ===

        C 1 Reply Last reply
        0
        • L Libra

          It already is double! === Game is power! ===

          C Offline
          C Offline
          Christian Graus
          wrote on last edited by
          #4

          OK, then try Decimal. Floating point isn't precise, that's just how it is. 1.5 + .5 is probably 1.999999, and then casting always rounds down. Christian Graus - Microsoft MVP - C++

          1 Reply Last reply
          0
          • L Libra

            See the FunA() and FunB() result, why any diffent? private void FunA() { double value; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for( **value = 2.1;** value >= -1.1; value -= 0.1 ) sb.AppendFormat("Ceiling({0:f})={1} Floor({0:f})={2} Round({0:f})={3} (int)({0:f}+0.5)={4} Truncate({0:f})={5}\n", value, Math.Ceiling(value), Math.Floor(value), Math.Round(value), (int)(value+0.5), Decimal.Truncate(Convert.ToDecimal(value))); return sb.ToString(); } private string FunB() { double value; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for( **value = 5.1;** value >= -1.1; value -= 0.1 ) sb.AppendFormat("Ceiling({0:f})={1} Floor({0:f})={2} Round({0:f})={3} (int)({0:f}+0.5)={4} Truncate({0:f})={5}\n", value, Math.Ceiling(value), Math.Floor(value), Math.Round(value), (int)(value+0.5), Decimal.Truncate(Convert.ToDecimal(value))); return sb.ToString(); } Reuslts is: FunA(): Ceiling(2.10)=3 Floor(2.10)=2 Round(2.10)=2 (int)(2.10+0.5)=2 Truncate(2.10)=2 Ceiling(2.00)=2 Floor(2.00)=2 Round(2.00)=2 (int)(2.00+0.5)=2 Truncate(2.00)=2 Ceiling(1.90)=2 Floor(1.90)=1 Round(1.90)=2 (int)(1.90+0.5)=2 Truncate(1.90)=1 Ceiling(1.80)=2 Floor(1.80)=1 Round(1.80)=2 (int)(1.80+0.5)=2 Truncate(1.80)=1 Ceiling(1.70)=2 Floor(1.70)=1 Round(1.70)=2 (int)(1.70+0.5)=2 Truncate(1.70)=1 Ceiling(1.60)=2 Floor(1.60)=1 Round(1.60)=2 (int)(1.60+0.5)=2 Truncate(1.60)=1 Ceiling(1.50)=2 Floor(1.50)=1 Round(1.50)=1 (int)(1.50+0.5)=1 Truncate(1.50)=1 Ceiling(1.40)=2 Floor(1.40)=1 Round(1.40)=1 (int)(1.40+0.5)=1 Truncate(1.40)=1 Ceiling(1.30)=2 Floor(1.30)=1 Round(1.30)=1 (int)(1.30+0.5)=1 Truncate(1.30)=1 Ceiling(1.20)=2 Floor(1.20)=1 Round(1.20)=1 (int)(1.20+0.5)=1 Truncate(1.20)=1 Ceiling(1.10)=2 Floor(1.10)=1 Round(1.10)=1 (int)(1.10+0.5)=1 Truncate(1.10)=1 Ceiling(1.00)=1 Floor(1.00)=0 Round(1.00)=1 (int)(1.00+0.5)=1 Truncate(1.00)=0 Ceiling(0.90)=1 Floor(0.90)=0 Round(0.90)=1 (int)(0.90+0.5)=1 Truncate(0.90)=0 Ceiling(0.80)=1 Floor(0.80)=0 Round(0.80)=1 (int)(0.80+0.5)=1 Truncate(0.80)=0 Ceiling(0.70)=1 Floor(0.70)=0 Round(0.70)=1 (int)(0.70+0.5)=1 Truncate(0.70)=0 Ceiling(0.60)=1 Floor(0.60)=0 Round(0.60)=1 (int)(0.60+0.5)=1 Truncate(0.60)=0 Ceiling(0.50)=1 Floor(0.50)=0 Round(0.50)=0 (int)(0.50+0.5)=0 Truncate(0.50)=0 Ceiling(0.40)=1 Floor(0.40)=0 Round(0.40)=0 (int)(0.40+0.5)=0 Truncate(0.40)=0 Ceiling(0.30)=1 Floor(0.3

            G Offline
            G Offline
            Guffa
            wrote on last edited by
            #5

            You can't make it exact using a floating point data type. A floating poing value is often not exactly the value you specify, as some values can not be represented exactly. For an example, the value 2.00 might actually be 2.000000000000001, and using Math.Ceiling() on that value will result in the value 3.0. --- b { font-weight: normal; }

            L 1 Reply Last reply
            0
            • G Guffa

              You can't make it exact using a floating point data type. A floating poing value is often not exactly the value you specify, as some values can not be represented exactly. For an example, the value 2.00 might actually be 2.000000000000001, and using Math.Ceiling() on that value will result in the value 3.0. --- b { font-weight: normal; }

              L Offline
              L Offline
              Libra
              wrote on last edited by
              #6

              I see. So that's say I can not get a very exact float value. But the other question is why the procedure is same, only diffrent between the begining value and loop times, it will make this difrrent. As you said, every time Math.Ceiling(2.00) must equal 3, but why in FunA() it is equal 2. They all are called by Math.Ceiling(value) and the value=2.00, the very small gap can not explain this result. === Game is power! ===

              D G 2 Replies Last reply
              0
              • L Libra

                I see. So that's say I can not get a very exact float value. But the other question is why the procedure is same, only diffrent between the begining value and loop times, it will make this difrrent. As you said, every time Math.Ceiling(2.00) must equal 3, but why in FunA() it is equal 2. They all are called by Math.Ceiling(value) and the value=2.00, the very small gap can not explain this result. === Game is power! ===

                D Offline
                D Offline
                Dan Neely
                wrote on last edited by
                #7

                .1 cannot be represented in binary, as a result when the 2nd loop should reach the same value the first one starts at, it actually different at the last few decimal places and will either be slightly above, or slightly below the expected value.

                1 Reply Last reply
                0
                • L Libra

                  I see. So that's say I can not get a very exact float value. But the other question is why the procedure is same, only diffrent between the begining value and loop times, it will make this difrrent. As you said, every time Math.Ceiling(2.00) must equal 3, but why in FunA() it is equal 2. They all are called by Math.Ceiling(value) and the value=2.00, the very small gap can not explain this result. === Game is power! ===

                  G Offline
                  G Offline
                  Guffa
                  wrote on last edited by
                  #8

                  You start at different values. When you get to 2.00, you have made a different amount of adds, so the accumulative error is different. That's why the result differs. --- b { font-weight: normal; }

                  1 Reply Last reply
                  0
                  Reply
                  • Reply as topic
                  Log in to reply
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes


                  • Login

                  • Don't have an account? Register

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • World
                  • Users
                  • Groups