在没有科学记数法的情况下从php发送大量数据到jquery

时间:2014-07-22 11:37:27

标签: javascript php jquery ajax yii

我有一个很大的数字[ 987654321999999 ],我想将它传递给jquery,但它返回大量的科学记数法[ 9.87654322E + 14 ]。如何在没有科学记数法的情况下将大数发送给jquery?


PHP函数

public function actionCalPrice()
{
$totalPrice = 987654321999999;
echo CJSON::encode($totalPrice);
}

在JQuery中

$.ajax({
  type: "POST",
  url: "<?php echo Yii::app()->createUrl('items/calPrice');?>",
  data:{ajax:ajax},
  dataType: "json",
  success: function(data) {
    alert(data);
    }
});

3 个答案:

答案 0 :(得分:1)

使用大整数时,最好使用字符串而不是整数。

public function actionCalPrice()
{
   $totalPrice = "987654321999999";
   echo CJSON::encode($totalPrice);
}

或者如果你不能在数字查找sprintf周围换引号以进行其他格式化。

public function actionCalPrice()
{
   $totalPrice = 987654321999999;
   echo CJSON::encode(rtrim(sprintf('%.20F', $totalPrice),'0'));
}

但是,您的Javascript在32位操作系统/应用程序上的表现会有所不同。

您想要的Javascript输出是什么?

此外,如果你的$ totalPrice实际上是一个变量而不是常量,例如从其他变量计算价格,我建议查看PHP的bcmath。 http://php.net/manual/en/book.bc.php

答案 1 :(得分:0)

987654321999999是比PHP可以处理的更大的数字。 PHP_INT_MAX是2147483647所以它试图找到最接近的数字。但是,如果您将此数字存储在某个位置,则可以使用例如number_format将其转换为字符串,这会奇怪地(我真的不知道如何)保留原始数字:

$totalPrice = 987654321999999;
$str = number_format($totalPrice, 0, ".", "");
echo $str;

如果你使用JSON.parse函数解析它,你将获得原始数字(因为JS有更大的数字)。

编辑:是的,当然,如果您正在运行64位操作系统(我也正在运行它并且我刚刚意识到它:D),INT的大小更大。但PHP无法以某种方式打印这些数字。

9999999999999999表现得很奇怪。 9999999999999999 === 10000000000000000评估为真。

答案 2 :(得分:0)

谢谢大家,我用GNU Multiple Precision解决了我的问题。 Useful link

public function actionCalPrice()
{
  $criteria = new CDbCriteria;
  $criteria->select='id,type_id,col1,col2,col3';
  $item = Items::model()->findByPk($opItem,$criteria);
  $totalPrice = gmp_add($totalPrice, $item->col2);
  echo CJSON::encode(gmp_strval($totalPrice));
}