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

How to manipulate the decimal part of a float in C++?

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

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

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

我无法找出(或查找)乘以小数部分的方法,即 "access" 仅乘以小数点右侧的内容。任何帮助将不胜感激!

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

并且最好不要为此目的使用浮点数。看别人的回答。

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

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

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

用modf解压。那应该消除额外的精度损失。

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

我建议按照以下方式做一些事情:

// 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 作为数字)。

将08:30转换为8.5而不是8.3进行浮点计算更容易也更合理。距0:00还有8.5小时。转换回来也很容易。小时是小数点左边,分钟是小数点右边60的倍数。