Go forward to Conditional Exp.
Go backward to Conversion.
Go up to Expressions.

Numeric and String Values
=========================

   Through most of this manual, we present `awk' values (such as
constants, fields, or variables) as *either* numbers *or* strings.
This is a convenient way to think about them, since typically they are
used in only one way, or the other.

   In truth though, `awk' values can be *both* string and numeric, at
the same time.  Internally, `awk' represents values with a string, a
(floating point) number, and an indication that one, the other, or both
representations of the value are valid.

   Keeping track of both kinds of values is important for execution
efficiency:  a variable can acquire a string value the first time it is
used as a string, and then that string value can be used until the
variable is assigned a new value.  Thus, if a variable with only a
numeric value is used in several concatenations in a row, it only has
to be given a string representation once.  The numeric value remains
valid, so that no conversion back to a number is necessary if the
variable is later used in an arithmetic expression.

   Tracking both kinds of values is also important for precise numerical
calculations.  Consider the following:

     a = 123.321
     CONVFMT = "%3.1f"
     b = a " is a number"
     c = a + 1.654

The variable `a' receives a string value in the concatenation and
assignment to `b'.  The string value of `a' is `"123.3"'.  If the
numeric value was lost when it was converted to a string, then the
numeric use of `a' in the last statement would lose information.  `c'
would be assigned the value 124.954 instead of 124.975.  Such errors
accumulate rapidly, and very adversely affect numeric computations.

   Once a numeric value acquires a corresponding string value, it stays
valid until a new assignment is made.  If `CONVFMT' (*note Conversion
of Strings and Numbers: Conversion.) changes in the meantime, the old
string value will still be used.  For example:

     BEGIN {
         CONVFMT = "%2.2f"
         a = 123.456
         b = a ""                # force `a' to have string value too
         printf "a = %s\n", a
         CONVFMT = "%.6g"
         printf "a = %s\n", a
         a += 0                  # make `a' numeric only again
         printf "a = %s\n", a    # use `a' as string
     }

This program prints `a = 123.46' twice, and then prints `a = 123.456'.

   See Conversion of Strings and Numbers: Conversion, for the rules
that specify how string values are made from numeric values.