fround method

void fround(
  1. MPData a,
  2. int prec, [
  3. int? mode
])

Implementation

void fround( MPData a, int prec, [int? mode] ){
	int n = getPrec( a ) - prec;
	if( n < 1 ){
		return;
	}
	int aa = _froundGet( a, n - 1 );
	bool u = false;
	bool uu = false;

	mode ??= froundHalfEven; // パラメータが2つの場合
	switch( mode ){
	case froundUp:
		uu = true;
		break;
	case froundDown:
		break;
	case froundCeiling:
		if( a.val(0) > 0 ){ uu = true; }
		break;
	case froundFloor:
		if( a.val(0) < 0 ){ uu = true; }
		break;
	case froundHalfUp:
		if( aa > 4 ){ u = true; }
		break;
	case froundHalfDown:
		if( aa > 5 ){ u = true; }
		break;
	case froundHalfEven:
		if( ClipMath.imod( _froundGet( a, n ), 2 ) == 1 ){
			if( aa > 4 ){ u = true; }
		} else {
			if( aa > 5 ){ u = true; }
		}
		break;
	case froundHalfEven2:
		if( mode == froundHalfEven2 && ClipMath.imod( _froundGet( a, n ), 2 ) == 1 && aa > 4 ){
			u = true;
			break;
		}
		// そのまま下に流す
		continue caseFroundHalfDown2;
	caseFroundHalfDown2:
	case froundHalfDown2:
		if( aa > 5 ){
			u = true;
		} else if( aa == 5 && n > 1 ){
			u = _froundIsNotZero( a, n - 2 );
		}
		break;
	}

	if( uu ){
		if( aa > 0 ){
			u = true;
		} else if( n > 1 ){
			u = _froundIsNotZero( a, n - 2 );
		}
	}

	if( u ){
		_froundZero( a, n );
		_froundUp( a, n );
	} else {
		_froundZero( a, n - 1 );
		_froundSet( a, n - 1, 0 );
	}
}