Formatação Float - Uma certa anomalia
Não sei se já perceberam, mas ai vai uma questão que o delphi faz e tem me causado dor de cabeça.
Delphi 10.1 Berlin, Windows 7 x64.
var
value: extended;
valuestring: String;
...
...
value:= StrToFloat('0.0001');
//value entra com 0.0001
valuestring:= FloatToStr(value);
//realmente retorna 0.0001
//onde mora o problema
value:= StrToFloat('0.00001');
//value entra com 1e-5
valuestring:= FloatToStr(value);
//realmente retorna 1e-5
Segundo padrão de ponto flutuante e precisão
deveria retornar o valor 0.00001
pois a precisão permite o armazenamento de 00001 e expoente 0
Faça isto no excel, por exemplo, sem formatação e irá verificar isto.
Assim tenho que desenvolver uma função de tratamento deste caso na unha, para separar e tratar cada casa decimal e casos de numero cientifico e numero normal. estou quase terminando ela. Apesar de um pouco complexo, mas ela desenvolve muito rápido. Esta ideia faz praticamente o que o excel desenvolve.
Atentem que por exemplo
0.0000000000000001234567890
isto sim, ele armazena na forma 1,23456789e-16 ou melhor armazenado como 123456789 expoente 15 sinal -
sem perda de precisão ate 15 dígitos de um valor extended 32 ou 64 bits.
Delphi 10.1 Berlin, Windows 7 x64.
var
value: extended;
valuestring: String;
...
...
value:= StrToFloat('0.0001');
//value entra com 0.0001
valuestring:= FloatToStr(value);
//realmente retorna 0.0001
//onde mora o problema
value:= StrToFloat('0.00001');
//value entra com 1e-5
valuestring:= FloatToStr(value);
//realmente retorna 1e-5
Segundo padrão de ponto flutuante e precisão
deveria retornar o valor 0.00001
pois a precisão permite o armazenamento de 00001 e expoente 0
Faça isto no excel, por exemplo, sem formatação e irá verificar isto.
Assim tenho que desenvolver uma função de tratamento deste caso na unha, para separar e tratar cada casa decimal e casos de numero cientifico e numero normal. estou quase terminando ela. Apesar de um pouco complexo, mas ela desenvolve muito rápido. Esta ideia faz praticamente o que o excel desenvolve.
Atentem que por exemplo
0.0000000000000001234567890
isto sim, ele armazena na forma 1,23456789e-16 ou melhor armazenado como 123456789 expoente 15 sinal -
sem perda de precisão ate 15 dígitos de um valor extended 32 ou 64 bits.
Guilherme Wiethaus
Curtidas 0
Respostas
Nicolas Kenji
18/07/2016
Se você só precisa do valuestring, poderia colocar um FormatFloat, segue o exemplo:
value := 0.00001;
valuestring := FormatFloat('0.#####', value);
Tá retornando o valor que você deseja..
value := 0.00001;
valuestring := FormatFloat('0.#####', value);
Tá retornando o valor que você deseja..
GOSTEI 0
Guilherme Wiethaus
18/07/2016
Ola amigo. Obrigado pela resposta. Mas eu já imaginei que alguém iria vir com esta resposta. Não é isto que estou procurando.
GOSTEI 0