Files
PhpSpreadsheet/tests/PhpSpreadsheetTests/Shared/Issue1324Test.php
T
oleibman 7689037b60 Additional Floating Point Precision Changes
Fix #1324, which went stale many years ago, and is now re-opened. It can be considered a follow-on to PR #4479 which was installed in May. The user complains of a *very* small loss of precision. This can be corrected by using `StringHelper::convertToString` in lieu of a simple cast from float to string in two places. `Style\NumberFormat\Formatter` is quite straightforward. `Writer\Csv` is a bit more complicated. If you put a float with more than 15 digits precision in a Csv, on opening it Excel will give a pop-up, saying something inaccurate like "We've corrected this for you - is that okay?" Better to avoid that by making sure to avoid too much precision when writing to Csv.
2025-08-06 17:53:04 -07:00

49 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Shared;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Csv as CsvWriter;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class Issue1324Test extends AbstractFunctional
{
protected static int $version = 80400;
public function testPrecision(): void
{
$string1 = '753.149999999999';
$s1 = (float) $string1;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getCell('A1')->setValue($s1);
self::assertNotSame(753.15, $sheet->getCell('A1')->getValue());
$formats = ['Csv', 'Xlsx', 'Xls', 'Ods', 'Html'];
foreach ($formats as $format) {
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
$rsheet = $reloadedSpreadsheet->getActiveSheet();
$s2 = $rsheet->getCell('A1')->getValue();
self::assertSame($s1, $s2, "difference for $format");
$reloadedSpreadsheet->disconnectWorksheets();
}
$spreadsheet->disconnectWorksheets();
}
public function testCsv(): void
{
$string1 = '753.149999999999';
$s1 = (float) $string1;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getCell('A1')->setValue($s1);
$writer = new CsvWriter($spreadsheet);
ob_start();
$writer->save('php://output');
$output = (string) ob_get_clean();
self::assertStringContainsString($string1, $output);
$spreadsheet->disconnectWorksheets();
}
}