C++ 将数字的小数部分转换为整数
c++ convert a fractional part of a number into integer
我需要将数字的小数部分转换为没有逗号的整数,例如,我有 3.35,我想只得到 35 部分,没有零或逗号,
因为我使用 modf() 函数来提取小数部分,但它给了我 0.35如果有任何方法可以做到这一点或过滤"0."部分,如果您向我展示如何使用更小的代码,我将不胜感激,<</p>
比转换为字符串并再次转换更有效:
int fractional_part_as_int(double number, int number_of_decimal_places) {
double dummy;
double frac = modf(number,&dummy);
return round(frac*pow(10,number_of_decimal_places));
}
#include <iostream>
#include <cmath>
double round(double r) {
return (r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5);
}
double floor_to_zero(double f) {
return (f > 0.0) ? std::floor(f) : std::ceil(f);
}
double sign(double s) {
return (s < 0.0) ? -1.0 : 1.0;
}
int frac(double f, int prec) {
return round((f - floor_to_zero(f)) * prec) * sign(f);
}
int main() {
double a = 1.2345;
double b = -34.567;
std::cout << frac(a, 100) << " " << frac(b, 100) << std::endl; // 23 57
}
另一种解决方案
int precision= 100;
double number = 3.35;
int f = floor(xx);
double temp = ( f - number ) * -1;
int fractional_part = temp * precision;
如果您需要将其作为字符串,则一个非常简单的C样式解决方案是(应该适用于可变的小数位数):
double yourNumber = 0.35f;
char buffer[32];
snprintf(buffer, 32, "%g", yourNumber);
strtok(buffer, "."); // Here we would get the part before . , should still check
char* fraction = strtok(NULL, ".");
int fractionAsInt = atoi(fraction);
此示例在字符串错误的情况下缺乏错误处理,如果您只需要固定的小数位数,则不可行,因为算术方法在那里效果更好。
这样的事情应该可以工作:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static int get_frac(double value, unsigned short precision)
{
return (int)((value - (long)value) * pow(10, precision));
}
static int get_frac_no_trailing_zeros(double value, unsigned short precision)
{
int v = get_frac(value, precision);
while (v % 10 == 0)
v /= 10;
return v;
}
int main(int argc, char *argv[])
{
double v;
v = 123.4564;
printf("%.4f = %dn", v, get_frac(v, 2));
printf("%.4f = %dn", v, get_frac(v, 4));
printf("%.4f = %dn", v, get_frac(v, 6));
printf("%.4f = %dn", v, get_frac_no_trailing_zeros(v, 6));
return EXIT_SUCCESS;
}
您可能还希望通过让用户首先提供 10 次方的数字来避免调用pow
,或者使用查找表。
使用一些 stl 魔法,下面是示例代码:
typedef std::pair<int, int> SplitFloat;
SplitFloat Split(float value, int precision)
{
// Get integer part.
float left = std::floor(value);
// Get decimal part.
float right = (value - left) * float(std::pow(10, precision));
return SplitFloat(left, right);
}
它可以改进,但非常简单。
我只是做了一些接近你想做的事情,尽管我仍然很新。无论如何,也许这将在未来帮助某人,因为我降落在这里寻找我的问题的结果。
第一步是确保包含 3.35 的变量是双精度值,但这可能是显而易见的。
接下来,创建一个仅是整数的变量,并将其值设置为等于双精度值。然后,它将仅包含整数。
然后从双精度中减去整数 (int)。您将留下分数/十进制值。从那里,只需乘以 100。
超过第 100 个十进制值,您显然必须进行更多的配置,但使用 if 语句应该相当简单。如果十进制值大于 .99,则乘以 1000 等。
这是我的做法。
#include <sstream>
#include <string>
int main()
{
double d = yourDesiredNumber; //this is your number
std::ostringstream out;
out << setprecision(yourDesiredPrecision) << std::fixed
<< std::showpoint << d;
std::istringstream in(out.str());
std::string wholePart; //you won't need this.
int fractionalPart;
std::getline(in, wholePart, '.');
in >> fractionalPart;
//now fractionalPart contains your desired value.
}
我很确定,而不是两个不同的istringstream
和ostringstream
对象,你可以只用一个stringstream
对象,但我不确定细节(从未使用过那个类),所以我没有在示例中使用它。
- 努力将整数转换为链表。不知道我在这里做错了什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在C++中将整数转换为其数字数组
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 如何将整数字符串转换为整数的二维向量?
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 使用 "stringstream " 将字符串转换为整数
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何检测 std::vector::emplace_back 上的隐式转换损失整数精度
- 如何防止双精度值到整数的隐式转换
- 为什么此指针值不能转换为整数的规则是什么?
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 无法将"整数 (*)[m]"转换为"整数 (*)[100000]
- 静态强制转换允许转换对象指针,但不允许转换整数