Cómo hacer redondeos de banqueros en JMPRecientemente me preguntaron sobre el redondeo de los banqueros y no encontré nada en la documentación de JMP. Escribí la función rápida a continuación (así como una opción de fórmula), pero tenía curiosidad si 1) JMP tiene un método fijo para hacer redondeos bancarios y 2) qué otros métodos mejores pueden ser útiles en comparación con los míos. http://wiki.c2.com/?BankersRounding
bankerRound = Function( {inputValue},
{inputValue, fDiff, cDiff, modX, bankRound},
fDiff = inputValue - Floor( inputValue );
cDiff = Ceiling( inputValue ) - inputValue;
modX = Modulo( Round( inputValue, 0 ), 2 );
If(
cDiff == fDiff & modX == 0, bankRound = Ceiling( inputValue ),
cDiff == fDiff & modX != 0, bankRound = Floor( inputValue ),
bankRound = Round( inputValue, 0 )
);
Return( bankRound );
);
inputValue = Empty(); // put column name here
fDiff = inputValue - Floor( inputValue );
cDiff = Ceiling( inputValue ) - inputValue;
modX = Modulo( Round( inputValue, 0 ), 2 );
If(
cDiff == fDiff & modX == 0, bankRound = Ceiling( inputValue ),
cDiff == fDiff & modX != 0, bankRound = Floor( inputValue ),
bankRound = Round( inputValue, 0 )
);Re: Cómo hacer redondeos de banqueros en JMPEso parece una solución más limpia. Lástima que JMP no tenga esto como una cosa de redondeo enlatado. Para ser honesto, no tenía idea de que había otros tipos de redondeo que ... ¿estándar? redondeo 
¡Gracias!Re: Cómo hacer redondeos de banqueros en JMPNo está construido pero yo pensar Esto logra lo mismo:
bankerRound = Function( {inputValue},
if( mod(inputValue, 0.5) == 0 & ! mod(inputValue, 1) == 0,
round(inputValue / 2) * 2,
round(inputValue)
)
);
tests = { 0,0.499,0.5,0.501,1,1.499,1.5,1.501,2,2.499,
2.5,2.501,3,3.499,3.5,3.501,-0.499,-0.5,-0.501,
-1,-1.499,-1.5,-1.501,-2,-3};
for( i = 1, i <= N items( tests ), i++,
Write( char( tests[i] ) || " -> " ||
char( bankerRound( tests[i] ) ) || "\!N" );
);Re: Cómo hacer redondeos de banqueros en JMPOk, eso se veía horrible ... intentemos esto para las dos opciones de fórmula:
bankerRound = Function({inputValue},
{inputValue,fDiff,cDiff,modX,bankRound},
fDiff = inputValue - floor(inputValue);
cDiff = ceiling(inputValue) - inputValue;
modX = Modulo(round(inputValue,0),2);
if(cDiff == fDiff & modX == 0,
bankRound = Ceiling(inputValue)
,
cDiff == fDiff & modX != 0,
bankRound = Floor(inputValue);
,
bankRound = Round(inputValue,0);
);
Return(bankRound)
);
inputValue = Empty(); // place column name here
fDiff = inputValue - floor(inputValue);
cDiff = ceiling(inputValue) - inputValue;
modX = Modulo(round(inputValue,0),2);
if(cDiff == fDiff & modX == 0,
bankRound = Ceiling(inputValue)
,
cDiff == fDiff & modX != 0,
bankRound = Floor(inputValue);
,
bankRound = Round(inputValue,0);
);