|
|
|||||
Человеческое округление
Во флеше есть три вида округления, при этом математически корректного ни одного =). Ведь округление в математике идет не обязательно целочисленно. Округление в математике производят либо до порядка, определенного точностью метода или аппаратуры. В данном случае очевидно использование стандартных флешовых округлялок. Но при расчетах требования к округлению несколько иные: количество значащих цифр, независимо от положения запятой или порядка величины.
То есть при округлении до трех значащих цифр: 90034.2 -> 90000 1.0354 -> 1.04 0.0043142 -> 0.00431 Сейчас пришло на ум лишь вот такое кандовое решение private function threeAP(num:Number):Number { if(num == 0 || !num) return 0; var k:Number; var numfin:Number; if( Math.abs(num) >=1) k = 10; else k = 0.1; for (var i:Number = 1; ; i++) { var numtemp:Number = Math.abs(num)/Math.pow(k,i); if( k==10 && numtemp < 1 ) { numfin=Math.round(numtemp*Math.pow(k,3))*Math.pow(k,i-3); break; } if( k==0.1 && numtemp >= 1 ) { numfin=Math.round(numtemp*Math.pow(10,2))/Math.pow(10,i+2); break; } } return numfin; } спасибо
__________________
Глупости какие-то говорите. |
|
|||||
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Мне хватает)) Пускай оно нечеловеческое
Последний раз редактировалось Kikasso; 28.10.2007 в 05:28. |
|
|||||
эээ не. =) это не то.
Честно признаться мне этого тоже хватет. Но не себе же делаю =).
__________________
Глупости какие-то говорите. |
|
|||||
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Или вот так, тож конечно не фонтан
num - число для округления, mult - параметр округления. Сколько цифр в mult, столько значащих цифр останется. function humanRound( num:Number, mult:Number ):Number{ var k:Number = num > 0 ? 1 : -1; while ( num > 10 ){ k *= 10; num *= .1; } while ( num < 1 ){ k *= .1; num *= 10; } return Math.round( num*mult )*k /mult; } trace ( humanRound( 12345.6789, 100 ) ); trace ( humanRound( 123456789, 1000 ) ); trace ( humanRound( .123456789, 100 ) ); |
|
|||||
Регистрация: Sep 2006
Адрес: Moscow
Сообщений: 62
|
Такой способ существует, но мало известен - математически верный, но как к нему флеш относится, надо проверить:
если необходимо, скажем число а, округлять с точностью до n знаков (имеется в виду дробные числа) после запятой, то нужно число а умножить на 10^n, произвести округление, и разделить результат на 10^n
__________________
We`re flashing the world! Последний раз редактировалось Zone71; 28.10.2007 в 16:09. |
|
|||||
ветеран форума
|
2 Zone71
...и именно этот способ реализован в посте #4
__________________
4am is time to rock |
|
|||||
Регистрация: Sep 2006
Адрес: Moscow
Сообщений: 62
|
Цитата:
__________________
We`re flashing the world! |
|
|||||
ветеран форума
|
Пойдет вполне, только mult лучше сделать типа int, т к дробным он быть не должен, и Number незачем использовать
__________________
4am is time to rock |
|
|||||
Регистрация: Sep 2006
Адрес: Moscow
Сообщений: 62
|
Цитата:
__________________
We`re flashing the world! |
|
|||||
Banned
[+5 08.09.07]
[+4 17.01.08] Регистрация: Dec 2005
Сообщений: 556
|
немного не в тему, но кому интересно, почитайте про unbiased/banker's rounding.
|
Часовой пояс GMT +4, время: 17:10. |
|
« Предыдущая тема | Следующая тема » |
|
|