gorlum15
11.11.2013 - 09:45
Ломаю голову несколько дней, затупил совсем
может есть спецы кто подскажет?
Суть вопроса:
Существует php функция
function format($chislo) {
$chislo += 9.99999999999999954748112e-7;
$chislo = round( $chislo, 2 );
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
echo format(55555555555555555555555555555555); // результат выполнения 55555555555555557535956863025152.00
Мне нужно сделать в точности наоборот - из получившейся форматной строки 55555555555555557535956863025152.00 получать исходное значение 55555555555555555555555555555555
Пожалуйста помогите в написании функции или в какую сторону копать )
Игорь_Vasinsky
11.11.2013 - 09:49
Но ты его округляешь же потом
Цитата |
$chislo = round( $chislo, 2 ); |
усё - точности уже не будет.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
gorlum15
11.11.2013 - 09:52
точность не нужна, хотя бы примерное восстановление
допустим исходная функция даже такая пусть будет
function format($chislo) {
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
Игорь_Vasinsky
11.11.2013 - 10:01
function format($chislo) {
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
наверно так как то
function unformat($chislo) {
$chislo = sprintf( "%d", $chislo );
return $chislo;
}
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
11.11.2013 - 10:04
не.. не вышло)
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
S.Chushkin
11.11.2013 - 10:53
Цитата (gorlum15 @ 11.11.2013 - 09:45) |
echo format(55555555555555555555555555555555); // результат выполнения 55555555555555557535956863025152.00 |
Число типа FLOAT имеет ограничение числа цифр - 15. (всё что больше у вас, это мусор) см.
http://www.php.net/manual/ru/language.types.float.phpИспользуйте для больших чисел одну из соответствующих библиотек и будет Вам счастье.
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
gorlum15
11.11.2013 - 12:10
Цитата (S.Chushkin @ 11.11.2013 - 10:53) |
55555555555555557535956863025152 |
Все-таки дело не в ограничении FLOAT. Потому что к примеру
echo format(55555555555555557535956863025152.00) вернет исходное значение 55555555555555557535956863025152.00 , хотя как Вы видите символов больше чем 15. Я думаю решение должно быть
gorlum15
11.11.2013 - 12:13
Цитата (Игорь_Vasinsky @ 11.11.2013 - 10:04) |
не.. не вышло) |
function unformat($chislo) {$chislo = sprintf( "%d", $chislo );return $chislo;}
Спасибо что откликнулись, но так я уже пробовал ) Не выходит ..
Игорь_Vasinsky
11.11.2013 - 12:30
ты понимаешь - сервер считая не может строить догадок , ты округляешь число - делаешь его не точным - соот-но обратный процесс - тоже вернёт не то число
смотри, давай найдём частное между числами - чтобы увидеть во сколько раз они отличаются друг от друга
5555555555555555934795202560.00 - вернула твоя функция от числа
5555555555555555555555555555
$ res = bcdiv('5555555555555555555555555555','5555555555555555934795202560.00', 10);
теперь попробуем получить число назад - возьмём полученное после твоей функции число - и умножим его на число $res - это логично
что в итоге получаем?
$chislo = (0.999999 * 5555555555555555934795202560.00);
echo number_format($chislo,0, 0,'');
сравнивай
было
5555555555555555555555555555
твоя функция вернула
5555555555555555934795202560.00
хотим превратить обратно - получаем
5555550000000000580378427392
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
gorlum15
11.11.2013 - 13:54
$chislo = '55555555555555555555555555555555';
function format($chislo) {
$chislo += 9.99999999999999954748112e-7;
$chislo = round( $chislo, 2 );
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
$format_chislo = format($chislo); // результат выполнения 55555555555555557535956863025152.00
$res = bcdiv($chislo,$format_chislo, 1000);
echo bcmul($format_chislo, $res, 1000); // результат выполнения 55555555555555555555555555555554.99
Игорь спасибо!
Игорь_Vasinsky
11.11.2013 - 14:01
а.. типо точность нудно было больше брать? ... ктож думал.. я и так 10 цифр после запятой взял))
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
11.11.2013 - 14:02
Цитата |
echo bcmul($format_chislo, $res, 1000); // результат выполнения 55555555555555555555555555555554.99 |
а если ceil() добавишь - то получишь в идеале)
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.