【问题标题】:How to manipulate the decimal part of a float in C++?如何在 C++ 中操作浮点数的小数部分?
【发布时间】:2015-07-25 08:04:41
【问题描述】:

背景:
我有一个整数时间数组,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。这是我能够减去/添加时间并以有意义的格式获得正确时差的唯一方法。

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

【问题讨论】:

  • 要不要在几小时内转换一下然后再操作
  • 有时你只需要回到绘图板上。
  • 别这样。改为存储整数分钟数(或使用标准表示,例如 std::tm)。
  • “不幸的是,数字就是这样存储的!” - 你所说的“存储”到底是什么意思?存储和文本表示是两个不同的东西。

标签: c++ floating-point integer


【解决方案1】:
float intPart = floor(newInTime);
float converted = intPart + (newInTime - intPart) / 0.6;

最好不要为此使用浮点数。查看其他人的答案。

【讨论】:

  • 此方法适用于 0800 以下和 1000 或以上的整数。它不适用于 0800 和 0999 之间的整数,因为它们被读取为八进制基数,这确实会混淆计算。
  • @WykoW 您如何将 0830 作为八进制基数?我对您的问题的理解是您将字符串读取为十进制数字。
  • 实际上,我发现通过 ifstream 将数字(存储为字符串)读取到我的程序中会剥离前导零,在这种情况下,八进制基数问题不再存在。然后你的解决方案就可以正常工作了。
【解决方案2】:

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

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

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

【讨论】:

  • 不使用浮点数是这个问题的唯一合理答案。时间(以分钟为单位)是一个整数值,因此请使用整数。
【解决方案3】:

您不想在浮点数中执行此操作,因为您可能会丢失精度。

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

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

【讨论】:

  • 只需使用std::tm。而且,精度在这里并不是一个真正的问题。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      相关资源
      最近更新 更多