Не уверен, почему нужно сравнивать как лексическое, но вы можете форсировать его с помощью sprintf
$basis_real = sprintf("%015.6f",$basis);
$cost_real = sprintf("%015.6f",$cost);
printf " %s -> %s", $basis_real, $cost_real;
if ($basis_real gt $cost_real) {
$cost = $basis;
printf " -> %015.6f", $cost;
}
Выход:
00010667.000000 -> 00012813.438340
00030667.000000 -> 00047014.045519
00026667.000000 -> 00040029.842300
00066667.000000 -> 00111603.373367
00008000.000000 -> 00008460.203780
00010667.000000 -> 00012813.438340
00073333.000000 -> 00123807.632158
00006667.000000 -> 00006321.420427 -> 00006667.000000
00080000.000000 -> 00136071.379474
Причина, по которой вы потерпели неудачу, как вы заметили, лексическое сравнение выполняет сравнение символов с символами, поэтому, когда оно достигает десятичной точки в 6667.
, оно фактически находится в алфавитном порядке перед 111603.
, поэтому оно больше.
Чтобы это исправить, вы должны сделать все числа одинакового размера, особенно там, где расположены десятичные дроби. % 015 - это общий размер числа, включая точку и десятичные дроби.