On Wed, 27 Feb 2002 22:10:44 +0100, Roger Baklund wrote:
>One obvious workaround is to avoid floating point numbers... or in mysql
>terms, use the decimal/numeric data type instead of float/double... but that
>does not solve the problem in this case, I guess floating point is used
>internally in the round() function...?
>
>With different numbers in the test table, I discovered that my version also
>did the rounding using the id field, but it seems the decimals parameter of
>the round() function is evaluated only once, I can't get it to output a
>different number of decimals for each row:
>
>mysql> select *,round(num1,id) from tab4;
>+------+----------+----------------+
>| id | num1 | round(num1,id) |
>+------+----------+----------------+
>| 1 | 1.2345 | 1.2000 |
>| 2 | 12.3456 | 12.3500 |
>| 3 | 100.4235 | 100.4230 |
>+------+----------+----------------+
>3 rows in set (0.01 sec)
>
>Note that the number of digits after the decimal sign is always four, but
>the rightmost digits are just padding zeroes... the number of digits
>actually coming from the num1 field is determined by the id field, and the
>round() function "works", if you can accept .4235 -> .423 on _some_
>platforms... a little substring magic, and we got the desired result:
>
>mysql> select *,@a:=round(num1,id) as tmp,left(@a,locate('.',@a)+id)+0 as
>result from tab4;
>+------+----------+----------+---------+
>| id | num1 | tmp | result |
>+------+----------+----------+---------+
>| 1 | 1.2345 | 1.2000 | 1.2 |
>| 2 | 12.3456 | 12.3500 | 12.35 |
>| 3 | 100.4235 | 100.4230 | 100.423 |
>+------+----------+----------+---------+
>3 rows in set (0.00 sec)
>
>Putting some time & effort in it, I was able to work around the round()
>rounding error, but I must warn you, it is rather messy... ;o)
>
>mysql> select *,@a:=mid(number,1,floor(log10(number))+3+digits) as tmp,
> -> left(if(right(@a,1)+0>4,@a+pow(10,-(floor(log10(number))+1)),@a),
> -> length(@a)-1)+0 as result from testme;
>+----------+--------+----------+---------+
>| number | digits | tmp | result |
>+----------+--------+----------+---------+
>| 100.4235 | 3 | 100.4235 | 100.424 |
>| 85.4000 | 1 | 85.40 | 85.4 |
>+----------+--------+----------+---------+
>2 rows in set (0.00 sec)
>
>mysql> select *,@a:=mid(num1,1,floor(log10(num1))+3+id) as tmp,
> -> left(if(right(@a,1)+0>4,@a+pow(10,-(floor(log10(num1))+1)),@a),
> -> length(@a)-1)+0 as result from tab4;
>+------+----------+----------+---------+
>| id | num1 | tmp | result |
>+------+----------+----------+---------+
>| 1 | 1.2345 | 1.23 | 1.2 |
>| 2 | 12.3456 | 12.345 | 12.35 |
>| 3 | 100.4235 | 100.4235 | 100.424 |
>+------+----------+----------+---------+
>3 rows in set (0.00 sec)
>
>It's not a pretty sight, but it seems to do the work.
OK. No more caffeine for you! 8-))
Doug
>
>--
>Roger
>query
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php