java - setscale - BigDecimal, precisión y escala
bigdecimal setscale (4)
Estoy usando BigDecimal para mis números en mi aplicación, por ejemplo, con JPA. Investigué un poco sobre los términos "precisión" y "escala", pero no entiendo cuáles son exactamente.
¿Alguien puede explicarme el significado de ''precisión'' y ''escala'' para un valor de BigDecimal?
@Column(precision = 11, scale = 2)
¡Gracias!
Citando precision :
La precisión es la cantidad de dígitos en el valor sin escalar.
y
Si es cero o positivo, la escala es el número de dígitos a la derecha del punto decimal. Si es negativo, el valor sin escala del número se multiplica por diez a la potencia de la negación de la escala. Por ejemplo, una escala de -3 significa que el valor sin escala se multiplica por 1000.
De su anotación de ejemplo, los dígitos máximos son 2 después del punto decimal y 9 antes (totalmente 11): 123456789,01
Un BigDecimal
se define por dos valores: un entero de precisión arbitrario y una escala de entero de 32 bits. El valor de BigDecimal
se define como .
Precisión:
La precision es la cantidad de dígitos en el valor sin escalar. Por ejemplo, para el número 123.45, la precisión devuelta es 5.
Entonces, la precisión indica la longitud del entero de precisión arbitrario. Aquí hay algunos ejemplos de números con la misma escala, pero diferente precisión:
- 12345/100000 = 0.12345 // escala = 5, precisión = 5
- 12340/100000 = 0.1234 // escala = 5, precisión = 4
- 1/100000 = 0.00001 // escala = 5, precisión = 1
En el caso especial de que el número sea igual a cero (es decir, 0,000), la precisión es siempre 1.
Escala:
Si es cero o positivo, la scale es el número de dígitos a la derecha del punto decimal. Si es negativo, el valor sin escala del número se multiplica por diez a la potencia de la negación de la escala. Por ejemplo, una escala de -3 significa que el valor sin escala se multiplica por 1000.
Esto significa que el valor entero del ''BigDecimal'' se multiplica por .
Aquí hay algunos ejemplos de la misma precisión, con diferentes escalas:
- 12345 con escala 5 = 0.12345
- 12345 con escala 4 = 1.2345
- ...
- 12345 con escala 0 = 12345
- 12345 con escala -1 = 123450 †
BigDecimal.toString:
El método toString
para un BigDecimal
comporta de manera diferente en función de la escala y la precision
. (Gracias a @RudyVelthuis por señalar esto).
- Si
scale == 0
, el número entero se acaba de imprimir, tal como está. - Si la
scale < 0
, siempre se utiliza la notación electrónica (por ejemplo, 5 escalas -1 produce "5E + 1") - Si
scale >= 0
yprecision - scale -1 >= -6
se produce un número decimal simple (por ejemplo, 10000000 escala 1 produce "1000000.0") - De lo contrario, se usa la notación E, por ejemplo, 10 escala 8 produce "1.0E-7" ya que la
precision - scale -1
es igual es menor que -6.
Más ejemplos:
- 19/100 = 0.19 // entero = 19, escala = 2, precisión = 2
- 1/1000 = 0.0001 // entero = 1, escala = 4, precisión = 1
Precisión: número total de dígitos significativos
Escala: Número de dígitos a la derecha del punto decimal
( Source )