paulo1205
(usa Ubuntu)
Enviado em 19/08/2016 - 00:35h
Números de ponto flutuante geralmente são representados internamente como binários. Isso implica que números decimais dificilmente vão ser representados com exatidão na forma binária. Por exemplo,
0.42f (tipo
float), que corresponde matematicamente à fração 42/100, tem de ser expresso em binário como 14092861/33554432, que corresponde ao valor exato
.4199999868869781494140625f. Então essa coisa de trabalhar internamente só com duas casas não vai funcionar exatamente como você talvez quisesse.
Dito isso, a forma mais óbvia de eliminar casas decimais não desejadas é multiplicar pela potência de 10 necessária para colocar as casas desejadas à esquerda da vírgula, truncar (ou arredondar) a parte fracionária, e depois dividir pela mesma potência de 10. Por exemplo, a seguinte transformação elimina tudo da terceira casa em diante.
f2=floor(f*100)/100;
Porém eu volto a alertar sobre a discrepância entre a notação decimal e a representação binária interna. Se você quiser números decimais exatíssimos, terá de trabalhar com alguma biblioteca ou compilador que implemente computação decimal, que não costuma ser o caso dos nossos PCs do dia-a-dia.
Quer ver que curioso? Imagine o valor 0,125, que tem uma fração binária exata (1/8, ou 2 elevado a -3), e também um decimal exato com três casas. Se você aplicar a regra acima para “arredondar” 0,125 para 0,12, vai acabar com um valor decimal inexato, pois ele terá de ser representado pela fração binária mais próxima 16106127/134217728, cujo valor exato é 0,119999997317790985107421875.