Cómo manejar el error de redondeo<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo este script que hace un cálculo simple y muestra el resultado en una ventana:
subtotal = 100.05 ;
porcentaje de descuento = 0.1 ;
importeDescuento = subtotal * PorcentajeDescuento;
totalantesdeimpuestos = subtotal - importedescuento;
mensaje formateado = concat (
"Total parcial:" , Repetir ( " " , 5 ), Formato (total parcial, "Divisa" ), "\!norte" ,
"Porcentaje de descuento:" , Repetir ( " " , 5 ), Formato (porcentajedescuento, "Por ciento" ), "\!norte" ,
"Importe de descuento:" , Repetir ( " " , 5 ), Formato (importe de descuento, "Divisa" ), "\!norte" ,
"Total antes de los impuestos:" , Repetir ( " " , 5 ), Formato (Total antes de los impuestos, "Divisa" ), "\!norte"
);
visualización de mensaje formateado = Nueva ventana ( "Resultado" ,
Cuadro de alineación ( columna N ( 1 ), Espaciado( 0 , 0 ), cuadro de borde ( Izquierda ( 20 ), Bien ( 20 ), arriba( 20 ), abajo( 20 ),
Caja de texto (mensaje formateado, << Establecer tamaño de fuente ( 14 ) ) )
),
Espectáculo (subtotal, cantidad de descuento, total antes de impuestos)
);
Produce lo siguiente, en el registro y en la ventana de salida:



entonces usando Formato (Total antes de los impuestos, "Divisa" ), resultados en totalBeforeTax siendo "redondeado hacia arriba". Puedo pensar en una variedad de formas de manejar esto, pero me preguntaba cuál sería la más recomendada.
Re: Cómo manejar el error de redondeoNo hay planes de Big Number en este momento.Se hicieron muchos puntos interesantes en el enlace de StackOverflow.Dependiendo de lo que haga con los números, pueden ser apropiadas diferentes soluciones.
craig
Re: Cómo manejar el error de redondeoOtra cosa que pensé fue convertir a cadena y usar Regex.
Re: Cómo manejar el error de redondeoGracias Craige, de hecho, he estado considerando construir una interfaz para permitir que JMP acceda a la clase BigDecimal de Java. ¿Hay planes para incluir esto como un tipo en la próxima versión de JMP?
Re: Cómo manejar el error de redondeoEs posible que desee redondear/nivel mínimo/techo en el cálculo de la cantidad de descuento.Round tiene un segundo argumento que quizás desee establecer en 2 para los dígitos después del decimal.El suelo y el techo necesitarán algo como suelo (x*100)/100 para obtener un resultado similar.
subtotal = 100,05;
descuentoPorcentaje = 0.1;
cantidad de descuento = redondo (subtotal * descuentoPorcentaje, 2) ;
totalantesdeimpuestos = subtotal - importedescuento;
show(cantidaddescuento, totalantesdelimpuesto);
importeDescuento = 10,01;
total antes de impuestos = 90,04;
La función de formato en su código original está en el filo de la navaja de redondear hacia arriba o hacia abajo con el 0.005 redondeado a dos lugares.La discrepancia en la presentación se desencadena porque el valor tiene un signo menos en un caso y un signo más en el otro... ambos valores se redondean, pero uno de ellos tiene un importe de descuento negativo en el cálculo.
Los números de coma flotante utilizados en JMP representan números como 0,01 como una fracción binaria repetitiva truncada.Al igual que 1/3 no es exactamente 0.333333333333, la representación interna no es exacta (excepto para fracciones binarias como 1/2, 1/4, 1/8, ...). si sumas 100 centavos, representados como 0,01, obtendrás un número muy cercano a 1,00, pero diferente en el lugar decimal 16'.Este minúsculo error siempre ha hecho que los paquetes de contabilidad elijan otra representación: java - ¿Por qué no usar Double o Float para representar la moneda? - Desbordamiento de pila
totales = 0;
For( i = 1, i <= 100, i++, total += .01 );
mostrar (formato (total, "fijo", 20,16));
Formato(total, "fijo", 20, 16) = "1.0000000000000007";
Re: Cómo manejar el error de redondeoHola Jim,
Gracias por tu respuesta. Entonces, Floor y Ceiling se redondean al entero más cercano. El formato (x, "Moneda") básicamente parece usar Round(x,2). Uno pensaría que el formato "Moneda" emplearía un método de truncamiento en lugar de redondeo.
Re: Cómo manejar el error de redondeoNo realizo muchos informes financieros, sin embargo, cuando necesito preocuparme por los errores de redondeo, solo uso las funciones Redondear(), Techo() y Suelo().