![]() |
|
||||||||||
|
|||||
|
Во флеше есть три вида округления, при этом математически корректного ни одного =). Ведь округление в математике идет не обязательно целочисленно. Округление в математике производят либо до порядка, определенного точностью метода или аппаратуры. В данном случае очевидно использование стандартных флешовых округлялок. Но при расчетах требования к округлению несколько иные: количество значащих цифр, независимо от положения запятой или порядка величины.
То есть при округлении до трех значащих цифр: 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, время: 05:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|