2012-03-08 30 views
5

Tôi đã tìm kiếm một lúc, nhưng những gì tôi có thể tìm thấy không phải là những gì tôi tìm kiếm. Tôi cần phải chuyển đổi một giá trị số nguyên, có thể là rất lớn, thành một chuỗi. Âm thanh dễ dàng: "$var"? Không, bởi vì điều này có thể dẫn đến việc hiển thị số E+.Chuyển đổi một số nguyên lớn thành một chuỗi đầy đủ trong PHP

<?php 

$var = 10000000000000000000000000; 
echo $var."\n"; 
echo "'$var'\n"; 
echo (string) $var."\n"; 
echo strval($var); 

?> 

1.0E+25 
'1.0E+25' 
1.0E+25 
1.0E+25 

Làm thế nào tôi có thể làm cho sản lượng được 10000000000000000000000000 để thay thế?

+3

Xin lưu ý rằng "số nguyên rất lớn" của bạn không được đại diện trong máy tính của bạn là một số nguyên, vì nó vượt quá cả 32bit và 64bit vọt. – thetaiko

+1

$ var = '10000000000000000000000000'; –

+0

Bạn không thể thực hiện việc này với giá trị int gốc. Nó sẽ phải được lưu trữ như một chuỗi. Nếu bạn đang thực hiện các phép toán trên con số này, bạn sẽ phải sử dụng thư viện [bcmath] (http://php.net/bcmath). –

Trả lời

8

này không được lưu trữ dưới dạng số nguyên bằng PHP, nhưng một phao, đây là lý do tại sao bạn kết thúc với 1.0e + 25 thay vì 10000000000000000000000000.

Đó là buồn bã không thể sử dụng như là một giá trị số nguyên trong PHP , vì PHP không thể lưu một số nguyên có kích thước đó. Nếu điều này đến từ cơ sở dữ liệu thì nó sẽ là một chuỗi và bạn có thể làm với nó bất cứ điều gì bạn muốn. Nếu bạn lưu trữ nó ở nơi khác thì lưu nó dưới dạng một chuỗi.

Phương án thay thế của bạn là lưu trữ nó dưới dạng phao và tính đến điều đó mọi lúc, mặc dù yêu cầu chuyển đổi và xử lý bổ sung ở những nơi.

Nó cũng được đề xuất sử dụng GNU Multiple Precision, nhưng điều đó không được bật trong PHP theo mặc định.

$int=gmp_init("10000000000000000000000000"); 
$string=gmp_strval($int); 
echo $string; 
+0

Tôi vừa mới đề xuất GMP. Không sử dụng phao - độ chính xác ở số lớn không đáng tin cậy. – AndrewR

2

UPDATE: Tìm thấy các bài tiếp theo:

// strval() will lose digits around pow(2,45); 
echo pow(2,50); // 1.1258999068426E+015 
echo (string)pow(2,50); // 1.1258999068426E+015 
echo strval(pow(2,50)); // 1.1258999068426E+015 

// full conversion 
printf('%0.0f',pow(2,50)); // 112589906846624 
echo sprintf('%0.0f',pow(2,50)); // 112589906846624 

Sử dụng printf hoặc sprintf.

+0

Tôi gửi sai số trước khi thêm phần thứ hai của câu trả lời –

+0

Nổi không đáng tin cậy ở kích thước này. 'echo sprintf ("% 0.0f ", 10000000000000000000000000);' trên đầu ra hệ thống của tôi '10000000000000000905969664'. – AndrewR

2

Các số nguyên bạn muốn bày tỏ:

$var = 10000000000000000000000000; 

không có sẵn trên hệ thống của bạn. Đó là quá lớn và do đó PHP chuyển đổi nó thành một phao mà sẽ thay đổi số (hệ thống 32 bit chẳng hạn):

 10000000000000000905969664 

giới hạn thường gặp là:

yours : 10 000 000 000 000 000 000 000 000 
32 bit:      2 147 483 648 
64 bit:   9 223 372 036 854 775 808 

Sự thay đổi của giá trị được gọi là điểm nổi chính xác, số PHP manual about integers sẽ cho bạn biết về giới hạn số nguyên và the floats page about floating point precision (xem cảnh báo màu đỏ lớn). Tùy thuộc vào hệ thống bạn đang có, bạn có thể biên dịch PHP với phạm vi ứng dụng của bạn cần hoặc bạn phải sử dụng một kiểu dữ liệu khác, ví dụ: the gmp library có thể chọn chuỗi dưới dạng số nguyên và xử lý chúng.

Ví dụ sau đây cho thấy chỉ đầu ra, nhưng bạn có thể làm phép nhân v.v .:

$r = gmp_init('10000000000000000000000000'); 
echo gmp_strval($r); 

Hy vọng điều này là hữu ích.

Các vấn đề liên quan