如何在C ++中操作float的小数部分?

时间:2015-07-25 08:04:42

标签: c++ floating-point integer

背景:
我有一个整数倍的数组给出0830为08:30,1745为17:45等。 我需要计算时间之间的时差。所以我首先将整数倍转换为浮点时间除以100.0。这意味着0830将成为8.30。

int inTime = 0830, outTime = 1745;
float newIntime = inTime/100.0;
float newOutTime = outTime/100.0;   

下一步,这是我的问题,是:如何将小数部分除以0.6,得到8.50。这是我能够以有意义的格式减去/添加时间并获得正确时差的唯一方法。

我无法弄清楚(或查找)一种乘法小数部分的方法,即仅“访问”小数点右侧的内容。任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:2)

float intPart = floor(newInTime);
float converted = intPart + (newInTime - intPart) / 0.6;

最好不要为此目的使用float。看其他人的回答。

答案 1 :(得分:2)

首先不要转换为浮动。使用模数来提取分钟:

int inTime = 830;
int inHours = inTime / 100;
int inMinutes = inTime % 100;
int inTotalMinutes = inHours * 60 + inMinutes;

此外,0830不是有效的文字。前导零使其被解释为八进制数,而8不是有效的八进制数。

答案 2 :(得分:0)

你不想在浮点数中这样做,因为你可能会失去精确度。

我建议按照以下方式做点什么:

// or use std::tm per Potatoswatter's comment
struct Time
{
  int hours;
  int minutes;
  Time(int time)
  {
    hours = time/100;
    minutes = time-hours*100;
  }
};


Time operator-(const Time& a, const Time& b)
{
  // You could also just return these minutes and be done with it
  int minutes (a.hours-b.hours)*60 + (a.minutes-b.minutes);
  Time result;
  result.hours = minutes/60;
  result.minutes = minutes-result.hours;
}

int main()
{
  Time inTime(830), outTime(1745);
  Time result = inTime-outTime;
  // ...
  return 0;
}

要记住的另一件事是,你应该写:

Time inTime(0830);

因为编译器会认为你在谈论八进制数(并且它不能将8作为数字)。

答案 3 :(得分:0)

对于浮点计算,将08:30转换为8.5而不是8.3更容易也更合理。从0:00起是8.5小时。转换回来也很容易。小时是小数点左边的小时,分​​钟是小数点右边的数字乘以60。

答案 4 :(得分:-1)

用modf提取它。这应该可以消除额外的精度损失。