MONEDA - valor doble vuelta sólo si tiene más de 2 decimales

Dylan:

Estoy tratando de dividir una factura y necesidad de calcular la cantidad que cada persona tendría que pagar si el proyecto de ley fue dividida en cantidades pares. Sé que una cantidad será diferente que el resto para dar cuenta de los centavos perdidos.

Supongamos 3 personas tratan de dividir una factura por 200. 200/3 es 66.6666666667. Lo que había planeado en hacer estaba cobrando las 2 primeras personas 66.67 y el último tiene suerte con el proyecto de ley 66.66.

Al minuto, tengo esto hasta ahora:

private String calculateAmountToPay(String noOfParticipants, String owed) {
    double amountOwed = Double.parseDouble(owed);
    int noOfMembers = Integer.parseInt(noOfParticipants);
    DecimalFormat amountFormat = new DecimalFormat("#.##");
    amountFormat.setRoundingMode(RoundingMode.CEILING);
    return amountFormat.format((amountOwed/(double)noOfMembers) / 100);
  }

Pero esto siempre volverá 66,67. ¿Hay alguna manera de que me puede conseguir que representan sólo alrededor de si hay un mayor número de 2 cifras decimales, si no, se queda en 66,66, por ejemplo?

Tal vez me estoy acercando a mal. Sé que la moneda puede ser meticuloso de tratar.

Bohemia:

Antes de pensar siquiera acerca de la aritmética, es necesario saber que doublees no un tipo de datos adecuado para su uso con la moneda, porque es imprecisa . Por lo tanto, dejar de utilizar un tipo de punto flotante (por ejemplo double) como el tipo de datos para la cantidad de dólares y comenzar a usar un tipo preciso (por ejemplo long) como el tipo de datos para la cantidad de centavos .

Los pasos a continuación para hacer el cálculo sería convertir inmediatamente todo, con redondeo, a centavos:

double amountOwed = ...;
int noOfMembers = ...;
long centsOwed = Math.round(amountOwed * 100);
long portionCents = Math.round(amountOwed * 100 / noOfMembers);
long errorCents = portionCents * noOfMembers - centsOwed;

He aquí una manera de lidiar con el error:

long lastPortionCents = portionCents - errorCents;

Pero es posible que el error es de más de 1 centavo, por lo que una mejor solución sería la de difundir el error de manera uniforme restando (o añadir si el error es negativo) 1 centavo de la primera (o última, o elegido al azar) errorCentscomensales.

El resto de la solución es entonces sobre desgarrador de lo anterior, que dejo al lector.

Como nota al margen, usando centavos es cómo los bancos transmiten cantidades (por lo menos para los puntos de venta de todos modos).


En cuanto a diseño básico de software, me gustaría crear un método independiente que acepta entero centavos y personas cuentan como sus parámetros y devuelve una matriz de las cantidades "split". Hacer esto no sólo hará que su código sea más fácil de leer, pero será compartmentaise la operación aritmética y permitir así un montón de pruebas sencillas para ser más fácilmente por escrito, para que pueda saber que tiene todos los casos el borde que se puede pensar en cubierta.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=187509&siteId=1
Recomendado
Clasificación