如何在c++中计算双变量的小数点
floating point - How to count the decimal places of an double variable in c++?
在我大学的一门课程中,我需要写一个程序将一个数字转换成自然语言,例如,如果用户输入"2.55",程序输出"2.55"。我快要完成了,唯一不能得到的是点之后的数字。不允许使用字符串。下面是我如何获取小数位数的计数:
i=0;
while((wert - (long int)wert) != 0){
wert /= 10;
i++;
}
但是它给我的值是小数点后356位的例子数字"2.55"。有没有不使用字符串来计数小数点的方法?
由于浮点精度,您将无法使用double
来完成此操作。例如,设置为0.2的double
将比1有更多的小数点,因为0.2不能精确表示。(为什么不在调试器中检查double
的实际值呢?)2.55也不能精确地表示。
对你来说最简单的事情可能就是用一个字符串来表示你的数字,并以此作为解析器的基础。
如果用户输入的是数字,它将以字符串形式输入,或者应该说是字节数组,因此根本不需要将浮点数带入其中。只要找到数据中的小数点,然后开始计数。
注:你标题里的问题没有意义。浮点变量没有小数位,它们有二进制位,而小数和二进制位是不可通约的。如果你的教授想让你使用浮点数,他自己需要重新教育。与2.55最接近的IEEE 64位二进制数是2.54999999999999982236431605997495353221893310546875,小数点后只有50位。
重复除法没有意义。忽略舍入误差,wert
的值为2.55、0.255、0.0255、0.00255等,它们都不等于任何一个长。当wert
下溢为零时,循环终止。
应该乘以10。然而,如果你保留前导数字,你可能会得到一个太大的数字,在得到相等之前不能作为长存储。相反,我建议每一步减去整数部分,并在结果为零时停止。
这仍然会得到小数点后50位的答案,但如果你的教授坚持要用双位数,也许这就是你想要的。
char* fractpart(double f)
{
char chrstr[5];
char charary={'1','2','3',....,'0'};
int intary={1,2,3,...,0};
int count=0,x,y;
f=f-(int)f;
while(f<=1)
{
f=f*10;
for(y=0;y<10;y++)
{
if((int)f==intary[y])
{
chrstr[count]=charary[y];
break;
}
}
f=f-(int)f;
if(f<=0.01 || count==4)
break;
if(f<0)
f=-f;
count++;
}
return(chrstr);
}
您必须知道在该点之后必须支持的最大位数。我们设n
位最大值。将数字的小数部分乘以10^n
,然后将结果数字向右移动,直到最后一位数字与0
不同,以删除末尾的零。然后依次打印数字:
void printDigitsAfterPoint(double x) {
int k = Math.round((x-(int) x)*Math.pow10(n));
// remove trailing zeroes
while (k!=0 && k%10==0) {
k/=10;
}
// output digits
while (k!=0) {
output(k%10); // you already should have a method like this...
k/=10;
}
}
确保添加处理x
负值的代码。我相信你的教授会尝试……
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 小数点后的数字,用于双精度变量/C++计算
- 如何在c++中将一个变量四舍五入到小数点后的n位
- 如果添加了小数点,则c++变量不添加
- 如何在c++中计算双变量的小数点