2016-10-18 17 views
-7

たとえば、入力が3456.7856の場合、出力は3456.786になります。C 10進数の後に浮動小数点数を3桁に丸める関数を使用するプログラム?

ありがとう、祝福された一日を!

+0

お読みください(ここでは、^は、ビット単位のXOR以外の累乗を意味します) [ツアー](http://stackoverflow.com/tour)と[*私はどのように良い質問をしますか?*](http://stackoverflow.com/help/how-to-ask) – Biffen

+3

あなたは変数のためにそれをしません。あなたは['printf'](http://en.cppreference.com/w/c/io/fprintf)であなたの出力をフォーマットするときにそれを行います。 –

+1

出力を丸めたり、丸められた値を変数に代入したりしますか? –

答えて

2

printfは、丸めを行うことができますと呼ばれる標準ライブラリ関数:

#include <stdio.h> 

int 
main(void) { 
    double dbl = 3456.7856; 
    printf("%.3f", dbl); 
} 

あなたには、いくつかの計算に丸めた値を使用したい場合:

#include <stdio.h> 
#include <float.h> 
#include <math.h> 

double 
round_to_3(double dbl); 

int 
main(void) { 
    double dbl = 3456.7856, dummy; // dummy will hold the integral part of dbl 
            // , which we won't use 

    if(modf(dbl, &dummy)) { 
     dbl = round_to_3(dbl); 
    } 

    // Do some computation 

    printf("%.3f", dbl); 
} 

double 
round_to_3(double dbl) { 
    char buffer[1 + 1 + DBL_MAX_10_EXP + 1 + 3 + 1]; 
    // Making sure the buffer is big enough: 
    // 
    // 1 for the potential sign 
    // plus 1 for the leading digit 
    // plus DBL_MAX_10_EXP for the potential digits before the decimal mark 
    // plus 1 for the decimal mark 
    // plus 3 for the digits after the decimal mark 
    // plus 1 for the ending '\0' 

    sprintf(buffer, "%.3f", dbl); 
    sscanf(buffer, "%lf", &dbl); 

    return dbl; 
} 

このソリューションは奇妙なようだが、それは勝ちましたオーバーフローを引き起こし、最大の精度を提供します。

あなたは、通常は重要ではすなわちbase^exponent、この場合は10^DBL_MAX_10_EXPに比べて非常に小さいので、丸めたときにmodf(dbl, &intpart) == 0を行う必要はありませんが。

関連する問題