Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > сравнивание больших целых в Smarty


Автор: Prompt 30.7.2007, 16:09
Рассказываю. 

Код

$smarty->assign("valpost", array("city"=>"1286652612928158144","country"=>"1286652612928158143", "nazn"=>"1286652612928158146"));
$this->smarty->assign('naz', $arSan);


в шаблоне
Код

  {section name=i loop=$nazn}
  <option{if $valpost.nazn == $nazn[i].id} selected{/if} value="{$nazn[i].id}">{$nazn[i]._Description}</option>
  {/section}



результат

Код


    <option value="1286829818087628275" >Черепановых</option>
    <option value="1286829858162940740" >Мукачевская</option>
    <option value="1286652612928158146" selected>Академическая</option>
    <option value="1286652612928158155" selected>Баррикадная</option>
    <option value="1286652612928158167" selected>Бобруйская</option>

    <option value="1286652612928158171" selected>Буханцева</option>
    <option value="1286652612928158174" selected>Дубовская</option>
    <option value="1286652612928158179" selected>Елецкая</option>
    <option value="1286652612928158192" selected>Елисеева</option>
    <option value="1286652612928158200" selected>Калинина</option>
    <option value="1286652612928158202" selected>Канунникова</option>

    <option value="1286652612928158211" selected>КИМ</option>


не могу понять в чем дело
При проверке типа 
{$valpost.nazn} и {$nazn[i].id} выводятся правильные числа

Автор: ewolf 27.8.2007, 01:07
Т.е. если использовать такой шаблон

Код

{section name=i loop=$nazn}
   <option{if $valpost.nazn == $nazn[i].id} selected{/if} value="{$nazn[i].id}">{$nazn[i]._Description} - {$valpost.nazn} - {$valpost.nazn}</option>
{/section}


Совпадающие значения $valpost.nazn и $valpost.nazn выводятся только один раз?

Автор: FractalizeR 27.12.2007, 19:45
Причина проста. Попробуйте выполнить следующие строки:

Код

<?php
echo(1286652612928158171);
echo("\r\n");
echo(1286652612928158174);

?>


Результат будет:
Код

C:\php>php test.php
1.2866526129282E+018
1.2866526129282E+018
 То есть они полностью совпадают!

При конвертировании больших числовых значений в строку теряется точность.

Я бы посоветовал вам сравнивать большие числа как строки в данном случае, предварительно преобразовав их в строку с помощью, скажем, функций GMP:
Код

<?php
$a = gmp_init("1286652612928158174");
echo gmp_strval($a);
?>


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)