如何在 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的倍数。
背景:
我有一个整数时间数组,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的倍数。