Pergunta

Alguém por favor pode explicar por que int (0.4 * 10.0) é 4 ainda int ((2.4 - 2.0) * 10.0) é 3?

E, em seguida, também por favor explicar como chegar 4. ou seja, eu realmente tenho que fazer int (System.Math.Round((2.4 - 2.0) * 10.0))?

É tão feia para algo que deve ser tão simples.

Foi útil?

Solução

A representação dupla de 2,4-2,0 é 0,399999999999. Quando você converte um número para int a parte decimal é truncado assim 3,999999999 é truncado para 3.

Outras dicas

E, em seguida, também por favor explicar como chegar 4. ou seja, eu realmente tenho que fazer

int (System.Math.Round ((2,4-2,0) 10,0 *))

é tão feia para algo que deve ser tão simples.

Claro que não, apenas definir

let round x = int System.Math.Round(x)

Na verdade, na Net, há um tipo de dados decimal que irá ajudá-lo com este problema, se seus números pode ser representado exatamente como frações decimais.

2.4m - 2.0m == 0.4m
2.4 - 2.0   != 0.4

Para converter um número generac odicetagcode a um uso float:

int

números de ponto flutuante não são precisão infinito. Alguns números pode ser representado perfeitamente (qualquer coisa que envolva potências de dois, por exemplo, 1, 1/2 = 0,5, 1/4 = 0,25, etc.), e outros podem não (por exemplo, 03/01 podem não ser exactamente decomposta em uma sequência finita de potências de dois). Muitas vezes, cortando o final da série infinita faz com que a versão codificada de um número para ser ligeiramente menor do que o seu verdadeiro valor.

Combine isso com o fato de que trunca o (int) do operador, em vez de rodadas, e você pode executar em casos em que uma operação que deve render 4,0 resultados em 3,999999999991 vez, que se torna 3.

Toda vez que você está tentando converter carros alegóricos / duplos para ints, você quer pensar cuidadosamente sobre qual o operador que deseja usar -. Truncando (arredondando para baixo), o arredondamento para cima, ou arredondamento-a-mais próximo

Uma vez que este é um problema com representações de ponto flutuante, isto é verdade não apenas em F #, mas C # e (IIRC) Java e outras linguagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top