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. Database & SysAdmin
  3. Database
  4. Decimals in integer operations

Decimals in integer operations

Scheduled Pinned Locked Moved Database
databasequestionsql-serversysadmin
12 Posts 4 Posters 2 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.
  • S shreekar

    OK - I have tried the below:

    declare @d decimal(10,2)
    select @d = 859 * 1/5
    select @d

    This returns 171.00 and

    declare @d decimal(10,2)
    select @d = 859.00 * 1/5.00
    select @d

    This returns 171.80 This tells me that the 2 numbers participating in the operation have to be decimals by definition. Is there any way to work around this as I do not want to change the column types to decimals as I do not expect them to hold fraction data any time. It is only the result that may have fraction data. Any ideas?

    Shreekar

    L Offline
    L Offline
    Lost User
    wrote on last edited by
    #3

    Cast[^] it;

    SELECT CAST(859 AS DECIMAL) / CAST(5 AS DECIMAL)

    I are Troll :suss:

    S 1 Reply Last reply
    0
    • S shreekar

      OK - I have tried the below:

      declare @d decimal(10,2)
      select @d = 859 * 1/5
      select @d

      This returns 171.00 and

      declare @d decimal(10,2)
      select @d = 859.00 * 1/5.00
      select @d

      This returns 171.80 This tells me that the 2 numbers participating in the operation have to be decimals by definition. Is there any way to work around this as I do not want to change the column types to decimals as I do not expect them to hold fraction data any time. It is only the result that may have fraction data. Any ideas?

      Shreekar

      S Offline
      S Offline
      shreekar
      wrote on last edited by
      #4

      Figured it out myself, I cast the operands themselves to decimals and the product was decimal. Sorry about that - turned out to be loud thinking than a genuine question.

      Shreekar

      D 1 Reply Last reply
      0
      • S shreekar

        Hi Database: SQL Server 2005 select 589/5 produces 117 How can I make it return 117.8? I am doing the division operation on 2 int columns and want the output in decimals. Do I have to make the columns themselves decimal? Thanks

        Shreekar

        L Offline
        L Offline
        Luc Pattyn
        wrote on last edited by
        #5

        in most programming languages, when all numbers are integer, division will truncate. You can promote a (sub)expression to floating-point in several ways: by inserting a floating constant, by having at least one floating variable, by casting, by converting. As a simple experiment, I would prefix 1.0* to whatever expression you are having. Warning: this rule also applies to subexpressions, so 2/5 will be zero, whereas 1.0*2/5 would not! :)

        Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

        Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

        S 1 Reply Last reply
        0
        • L Lost User

          Cast[^] it;

          SELECT CAST(859 AS DECIMAL) / CAST(5 AS DECIMAL)

          I are Troll :suss:

          S Offline
          S Offline
          shreekar
          wrote on last edited by
          #6

          Just missed your post. Realised the same solution as you suggested. Thanks for the confirmation!

          Shreekar

          L 1 Reply Last reply
          0
          • S shreekar

            OK - I have tried the below:

            declare @d decimal(10,2)
            select @d = 859 * 1/5
            select @d

            This returns 171.00 and

            declare @d decimal(10,2)
            select @d = 859.00 * 1/5.00
            select @d

            This returns 171.80 This tells me that the 2 numbers participating in the operation have to be decimals by definition. Is there any way to work around this as I do not want to change the column types to decimals as I do not expect them to hold fraction data any time. It is only the result that may have fraction data. Any ideas?

            Shreekar

            D Offline
            D Offline
            David Skelly
            wrote on last edited by
            #7

            declare @n integer
            declare @d decimal(10,2)
            select @n = 859
            select @d = CAST(@n AS decimal(10,2)) / 5
            select @d

            Returns 171.80

            1 Reply Last reply
            0
            • S shreekar

              Figured it out myself, I cast the operands themselves to decimals and the product was decimal. Sorry about that - turned out to be loud thinking than a genuine question.

              Shreekar

              D Offline
              D Offline
              David Skelly
              wrote on last edited by
              #8

              It's like buses. You stand around waiting for an answer, and then three come along all at the same time.

              1 Reply Last reply
              0
              • S shreekar

                Just missed your post. Realised the same solution as you suggested. Thanks for the confirmation!

                Shreekar

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #9

                You're welcome. Thinking out loud helps, even on a messageboard :)

                I are Troll :suss:

                1 Reply Last reply
                0
                • L Luc Pattyn

                  in most programming languages, when all numbers are integer, division will truncate. You can promote a (sub)expression to floating-point in several ways: by inserting a floating constant, by having at least one floating variable, by casting, by converting. As a simple experiment, I would prefix 1.0* to whatever expression you are having. Warning: this rule also applies to subexpressions, so 2/5 will be zero, whereas 1.0*2/5 would not! :)

                  Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                  Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                  S Offline
                  S Offline
                  shreekar
                  wrote on last edited by
                  #10

                  Multiplying by 1.0 is definitely easier on the eyes than multiple nested cast statements and produces the same output - at least in my case because there is only one operation. So thanks for that. Earlier, I had read posts alluding to this technique but I had missed the point - now I get it.

                  Shreekar

                  L D 2 Replies Last reply
                  0
                  • S shreekar

                    Multiplying by 1.0 is definitely easier on the eyes than multiple nested cast statements and produces the same output - at least in my case because there is only one operation. So thanks for that. Earlier, I had read posts alluding to this technique but I had missed the point - now I get it.

                    Shreekar

                    L Offline
                    L Offline
                    Luc Pattyn
                    wrote on last edited by
                    #11

                    you're welcome. :)

                    Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                    Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                    1 Reply Last reply
                    0
                    • S shreekar

                      Multiplying by 1.0 is definitely easier on the eyes than multiple nested cast statements and produces the same output - at least in my case because there is only one operation. So thanks for that. Earlier, I had read posts alluding to this technique but I had missed the point - now I get it.

                      Shreekar

                      D Offline
                      D Offline
                      David Skelly
                      wrote on last edited by
                      #12

                      One word of warning with this technique, the following give different results:

                      859 / 5 * 1.0
                      1.0 * 859 / 5

                      If you go down this route, you will need to understand how SQL Server applies its rules for implicit datatype conversion.

                      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