PHP浮点数保留两位小数:.00

73

当我进行如下类型转换:

(float) '0.00';

我得到了 0。如何获得 0.00 并仍然保持数据类型为浮点数?


0.00 不是有效的浮点数,请参考 http://en.wikipedia.org/wiki/IEEE_floating_point。 - Baba
13个回答

143

浮点数没有00.00:它们是内部的(IEEE754)二进制格式的不同字符串表示方式,但浮点数是相同的。

如果您想将浮点数表示为“0.00”,您需要将其格式化为字符串,使用number_format

$numberAsString = number_format($numberAsFloat, 2);

11
我不想要一个字符串。我想要一个浮点数。但是由于似乎不能有0.00,所以我只能用“0.00”或0来应付了。 - StackOverflowNewbie
3
格式化后无法保留浮点数数据类型,因此不能作为问题的有效答案。 - Senior PHP Developer
@IMSoP,是的,正确的。我解释了同样的事情。 - Senior PHP Developer
1
@SeniorPHPDeveloper,那么你在2020年的评论就没有意义了。这个答案是尽可能“有效”的:它说你不能将其作为浮点数执行,但是这里是如何将其作为字符串执行的。 - IMSoP
2
@SeniorPHPDeveloper,老实说,我有点困惑你的意思。你在2020年的评论中说这不是一个“有效的答案”,暗示你认为另一个答案是有效的;但你似乎同意“保持数据类型为浮点数”的要求是不可能的;因此,唯一可能的答案就是谈论字符串表示,这也是这个答案所做的。那么你到底想表达什么意思? - IMSoP
显示剩余3条评论

9
据我所知,PHP没有解决此问题的方法。本主题中提供的其他答案(上下)都是无意义的。
number_format函数返回字符串作为结果,这是PHP.net自己规定的。
如果您传递3.00作为值,则floatval/doubleval等函数将返回整数。
如果进行类型转换,则会得到一个整数作为结果。
如果使用round()函数,则会得到一个整数作为结果。
我能想到的唯一可能的解决方案是使用数据库进行类型转换为float。例如MySQL:
SELECT CAST('3.00' AS DECIMAL) AS realFloatValue;

使用一个抽象层,返回浮点数而不是字符串,然后你就可以执行它了。


修改JSON输出

如果您正在寻找解决方案来修复JSON输出以保留2个小数,则可以使用以下代码中的后处理:

// PHP AJAX Controller

// some code here

// transform to json and then convert string to float with 2 decimals
$output = array('x' => 'y', 'price' => '0.00');
$json = json_encode($output);
$json = str_replace('"price":"'.$output['price'].'"', '"price":'.$output['price'].'', $json);

// output to browser / client
print $json;
exit();

返回给客户端/浏览器:

{"x":"y","price":0.00}

感谢您指出 JSON,如果您确定只使用数字而不包含任何 " 字符,则可以在使用 number_format 和 json 编码之后,只需使用以下代码即可:$json = str_replace('"', '', $json); - Nabi K.A.Z.
但是,您的键可能不包含空格,否则您的输出将无法验证。有些人会这样做;-) - Tim B.
抱歉,但你在胡说八道。你是完全正确的,number_format返回一个字符串;而无论何时你想要查看一个数字,都需要一个字符串。如果你看过整数或浮点数的二进制表示,它不会看起来像“2”、“2.0”、“2.00”或任何其他东西;这些都是数字的人类可读表示。 - IMSoP
关于 JSON(问题中没有提到),只需使用此处记录的 JSON_PRESERVE_ZERO_FRACTION 选项。再次强调,这是关于如何表示数字,而不是它的类型 - IMSoP

6

0.00实际上是0。如果您需要在echo时保留0.00,则可以使用number_format函数,如下所示:

number_format($number, 2);

1
当你将其转换为JSON时,它将使数据类型成为字符串。 - Vipul Hadiya

6
您可以显示浮点数
  • 带有一定数量的小数位
  • 以特定格式(本地化)显示

例如:

$myNonFormatedFloat = 5678.9

$myGermanNumber = number_format($myNonFormatedFloat, 2, ',', '.'); // -> 5.678,90

$myAngloSaxonianNumber = number_format($myNonFormatedFloat, 2, '.', ','); // -> 5,678.90 

请注意,第一个参数是您想要格式化的浮点数,第二个参数是小数位数,第三个参数是用于视觉上分隔小数的字符,第四个参数是用于视觉上分隔千位的字符。

2
使用number_format()函数来改变数字的显示方式。它将返回一个字符串,原始变量的类型不受影响。

嗨,@Bart Friederichs,有没有办法返回十进制数据类型而不是字符串?谢谢。 - natsumiyu
@natsumiyu PHP没有十进制数据类型,因此没有办法做到这一点。 - Bart Friederichs

1
尝试这个。
$nom="5695.5";
number_format((float)($nom), 2, '.', ','); // -> 5,695.50

$nom="5695.5215";
number_format((float)($nom), 2, '.', ','); // -> 5,695.52

$nom="5695.12";
number_format((float)($nom), 0, '.', ','); // -> 5,695

//使用 round()
$nom="5695.12";
number_format((float)round($nom), 2, '.', ','); // -> 5,695.00

$nom="5695.52";
number_format((float)round($nom), 2, '.', ','); // -> 5,696.00

无法使用1,000或10,000.12(其他国家货币格式)。 - Tanktiger
echo number_format((float)round(10.000,12), 2, '.', ','); // -> 10.00; 回显 number_format((float)round(10.000,12), 2, '.', ','); // -> 10.00; - Waruna Manjula

0
这个页面上的许多评论都忽略了一个基本点,那就是问题本身就不合理。浮点数是一种二进制表示法,旨在进行高效计算;它根本没有任何十进制数字的概念。
因此,问这个问题:
“如何在数据类型为浮点数的情况下获得‘0.00’而不是‘0’?”
就像问这个问题一样:
“如何在语言为英语的情况下获得‘deux’而不是‘zwei’?”
无论您将输入指定为“2”、“2.0”还是“2.000000000”,如果您要求浮点值,存储在内存中的值将是这样的(在IEEE 754双精度下):
0100000000000000000000000000000000000000000000000000000000000000
如果您转换为整数,则存储在内存中的值将是这样的(假设为64位系统):
0000000000000000000000000000000000000000000000000000000000000010

(请注意,在此上下文中,“整数”不仅仅是“整数”的同义词,它是一种特定的数据类型,具有自己的规则,用于表示内存中的值。)

相比之下,字符串“2”看起来像这样:

00110010

而字符串“2.00”看起来像这样:

00110010001011100011000000110000

(在PHP程序中,实际上会有额外的内存信息,例如类型指示器,但这在这里并不重要。)


所以,这个问题只能通过重新表述为一个“转换”来回答:给定一个浮点数的输入,如何选择一个具有固定小数位数的字符串表示形式。
正如其他人指出的那样,答案是使用number_format
问题没有提到 JSON,但是有几个评论提到了它,所以我也想指出 PHP 的 json_encode 函数有一个选项 JSON_PRESERVE_ZERO_FRACTION ,它会将浮点数格式化为一个带有尾随 ".0" 的整数,例如:
$example = ['int' => 2, 'float' => 2.0];
echo json_encode($example);
# => {"int":2,"float":2}
echo json_encode($example, JSON_PRESERVE_ZERO_FRACTION);
# => {"int":2,"float":2.0}

请注意,这是该值的字符串表示形式。

0

你可以尝试这个,它会对你有用

number_format(0.00, 2)

1
但在PHP中,它无法维护数据类型。 - Senior PHP Developer

-1

你可以使用 round 函数

round("10.221",2);

将返回 10.22


1
10.00和10之间有什么区别? - jewelhuq
1
我的使用情况是始终使用两位小数来显示价格,但我仍希望它是浮点数,以便可以对其进行计算。原始问题特别想要显示 .00。 - Baxny
但在PHP中,它无法维护数据类型。 - Senior PHP Developer
它运行良好。谢谢jewelhuq。 - Shahriar Ahmad

-2

不限制小数位数。 - Design by Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接