AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.12.2004, 13:43   #1  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Round
PHP код:
static void Job2(Args _args)
{;
    
info(strFmt("%1",Round(123.0099999,1.001)));
    
pause;

Результат 123,12 -- для меня весьма странный результат!

Подскажите как работает округление!!
Старый 09.12.2004, 13:53   #2  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Правильно будет:

PHP код:
static void Job2(Args _args)
{;
    
info(strFmt("%1",Round(123.0099999,0.001)));
    
pause;

Второй аргумент в ф-ии Round - это число кратности округления. Т.е. округление происходит к ближайшему числу, кратному этому параметру.
Более логично выглядит ф-я DecRound( X, Y ), которая округляет число X до Y знаков после запятой. В нашем случае:

PHP код:
static void Job2(Args _args)
{;
    
info(strFmt("%1",DecRound(123.0099999,3)));
    
pause;

P.S.
Заметьте что у вас в примере выводится число 123.12, хотя на самом деле результат выражения в аксапте 123.123. Тут дело в том что strFmt по умолчанию выводит только 2 знака после запятой в числах. Учитывайте это. Используйте num2str с указанием числа знаков после запятой, либо воспользуйтесь ф-ей:

PHP код:
public static str real2strreal number )
{
    
real num absnumber );
    
real int_part truncnum );
    
real frac_part fracnum );
    
str int_str;
    
str frac_str;
    
int dig;
    
// Generate int str
    
while ( int_part )
    {
        
dig 10 * (int_part 10 trunc(int_part 10));
        
int_part truncint_part 10 );
        
int_str num2chardig char2num"0") ) + int_str;
    }
    
// Generate frac str
    
while ( frac_part )
    {
        
dig truncfrac_part 10 );
        
frac_part fracfrac_part 10 );
        
frac_str frac_str num2chardig char2num"0") );
    }
    
// Make final result
    
if (strlenint_str ) == )
    {
        
int_str "0";
    }
    if ( 
strlenfrac_str ) != )
    {
        
int_str int_str "." frac_str;
    }
    if ( 
number )
    {
        
int_str "-" int_str;
    }
    if ( 
number != str2numint_str ) )
    {
        
error" *** MISMATCH OF " num2strnumber041) + " AND " int_str );
        
//for ( dig = 1; dig < 1000000; dig++ )
        //{
            // Do nothing
        //}
    
}
    return 
int_str;

За это сообщение автора поблагодарили: mazzy (5).
Старый 09.12.2004, 13:56   #3  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Ну красота! Спасибо!
Старый 21.02.2007, 19:24   #4  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
Здравствуйте.
Не подскажет ли мне кто, почему округление round(1/3,0.01) возвращает 0.333333333?
в дебаггере нормально, в рабочем режиме - не округляет?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: Convergence Sessions Round-up Blog bot DAX Blogs 0 13.03.2008 19:05
Аналог round() возвращающий int Андре DAX: Программирование 16 21.05.2007 16:43
select sum(amount) Eldar9x DAX: Программирование 33 01.02.2007 16:41
Round() в Range Hek DAX: Программирование 11 21.12.2006 13:16
Здравствуйте дети! :) ta_and DAX: База знаний и проекты 56 05.11.2004 07:27

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:13.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.