質問を説明するのは難しいです。小数点以下の値を四捨五入せずに double の数値を整数に変換したいと思います。例えば
double a = 123.456
なりたい
int b = 123456
桁数が知りたいので、計算したら後ろにずらすと123.456
PS:この問題の性質を計算せずに、純粋な数学的方法でこの問題を解決したいだけです。
123.456 という数値は double として存在しないため、問題の解決策はありません。小数点を削除すると、この数値は明らかにどの整数型にも適合しません。
123.456 を正確な数値 123.456 として扱いたい場合、リモートで簡単にこれを行う唯一の方法は、文字列に変換し、文字列から小数点を削除することです。これは次のようなもので達成できます
snprintf(buf, sizeof buf, "%.13f", 123.456);
ただし、実際に印刷したい場所の数を把握することはかなり困難です. 使用しすぎると、上で示した正確な値の一部を取得することになります。使用するものが少なすぎると、保持したい場所が失われることは明らかです。
これを行う標準的な方法は次のようになると思います
#include <math.h>
#include <stdio.h>
int main()
{
double d = 123.456;
double int_part;
double fract_part;
fract_part = modf(d, &int_part);
int i = (int)int_part*1000 + (int)(fract_part*1000);
printf("%d", i);
}
ここで、リテラル 1000 は、目的の小数点以下の桁数を決定する定数です。
テキストがある場合は"123.456"
、小数点を削除して、結果のテキスト表現を整数値に変換するだけです。すでにテキストを浮動小数点値 ( double a = 123.456;
) に変換している場合、すべての賭けはオフです。浮動小数点値は 2 進分数として表されるため、事前に設定された 10 進数の桁数はありません。これは、通常の使用法では 1/3 と .3333 のようなものです。通常、.3333 は 1/3 を意味するふりをしますが、これらは同じ値ではありません。