Me di cuenta de que cuando almacenaba un valor doble como, por ejemplo, x = 0.56657011973046234
en una base de datos sqlite, y luego recuperarlo más tarde, obtengo y = 0.56657011973046201
. De acuerdo con sqlite spec y .NET spec (ninguno de los cuales originalmente me molesté en leer :) esto es esperado y normal.¿Cómo puedo "recortar" un doble de C# al valor que se almacenará como en una base de datos sqlite?
Mi problema es que, si bien la alta precisión no es importante, mi aplicación trata con los usuarios que ingresan/seleccionan dobles que representan información 3D básica y luego ejecutan simulaciones sobre ellos para encontrar un resultado. Y esta entrada se puede guardar en una base de datos sqlite para volver a cargarla y volver a ejecutarla más tarde.
La confusión se produce porque una serie recién creada de entradas obviamente simulará de forma ligeramente diferente a esas mismas entradas una vez almacenadas y cargadas (ya que los valores dobles han cambiado). Esto es lógico, pero no deseable.
No he llegado a un acuerdo sobre cómo lidiar con esto, pero mientras tanto me gustaría limitar/fijar las entradas del usuario a los valores que se pueden almacenar exactamente en una base de datos sqlite. Entonces, si un usuario ingresa 0.56657011973046234
, en realidad se transforma en 0.56657011973046201
.
Sin embargo, no he podido averiguar, dado un número, qué valor se almacenaría en la base de datos, excepto almacenarlo y recuperarlo de la base de datos, lo que parece torpe. ¿Hay una forma establecida de hacer esto?
Ya sabes, si la microcomputadora Royal McBee hubiera hecho esto, Edward Lorenz nunca habría descubierto la teoría del caos. :) –
@fostandy: ¿Son esos valores reales (0.56657011973046234 y 0.56657011973046201) o los inventaron? 0.56657011973046201 tiene 17 dígitos, por lo que se supone que debe redondear el viaje al mismo valor doble que 0.56657011973046234 (lo compruebo en C y no) –
@Rick Regan - 0.56657011973046234 es algo que obtuve de random.NextDouble(). 0.56657011973046201 es lo que obtuve una vez que lo almacené en un campo numérico sqlite y lo busqué de nuevo. Según lo entiendo (que es limitado), los últimos 2 dígitos no están garantizados para ida y vuelta. – fostandy