使用2个小数位

时间:2016-03-18 06:39:58

标签: c floating-point

我已经定义了这样的字符数组。

char pkgamount[20]="";    

这可以通过120,-120,-120.23等值(最多2位小数)填充

我目前将char数组转换为这样的整数。

    int amt2;
    sscanf(pkgamount, "%d", &amt2);

将包含负小数的字符数组转换为只包含2位小数的浮点值的正确方法是什么?

更新:#1

我从数据库(VARCHAR)读取值到字符数组。这个值最多有2个小数位。值可以是0 /有2个小数位/没有小数位。我认为整数数据类型不能有小数位。我需要添加/减去这些值。所以我需要将字符数组转换为float。

更新#2

我尝试使用float并且我不断得到一些随机输出。请在下面提取的代码

float bamt1,bamt2,amt1,amt2;
float balance1,balance2;
sscanf(stbamount, "%f", &amt1);
sscanf(pkgamount, "%f", &amt2);
//amoun1=32 amount2=23 any decimal or non decimal values..using API  
//Using API on device to read this..skipping the code for that
sscanf(amount1, "%f", &bamt1);
sscanf(amount2, "%f", &bamt2);
balance1=amt1-bamt1;
balance2=amt2-bamt2;
// buffers used for conversion and printing 
char buf1[sizeof(int)*3+2]="";
snprintf(buf1, sizeof buf1, "%f", balance1);
char buf2[sizeof(int)*3+2]="";
char sbal[20]="";
char pbal[20]="";
strcat(sbal,"STB Balance: ");
strcat(pbal,"PKG Balance: ");
strcat(sbal,buf1);
strcat(pbal,buf2);     
//prn_write_text is API Call to run thermal printer on device 
prn_write_text(sbal,strlen(sbal),1);       
prn_write_text(pbal,strlen(pbal),1);   
snprintf(buf2, sizeof buf2, "%f", balance2);   

更新#3

这是使用热敏打印机编写一些文本的API调用。我需要将浮点值转换为字符串并将其剪切,以便它只包含2个十进制值。

enter image description here

4 个答案:

答案 0 :(得分:1)

使用浮动来存储数字..

float amtf;
sscanf(pkgamount, "%f", &amtf);

将数字打印到2位小数

printf (".2%f",amtf);

只要您愿意在加法或减法期间容忍可能为0.01的错误,您就可以使用浮点数来存储数字。它使代码更容易。

但是,如果您必须精确到最后的0.00,那么您应该使用整数* 100来存储数据,如M Oehem所建议。

答案 1 :(得分:1)

只需循环播放你的角色

enum parseFloatErrorCodes {
    SUCCESS, DOUBLE_DOT,PARSE_ERROR, INTEGER_OVERFLOW,
    TOO_MANY_DIGITS_AFTER_DECIMAL_POINT
};
int parse_float(char* inp, float *x) { 
    char *p;
    int ival, dot;
    for (ival = 0, dot = 0, p = inp; *p; ++p) {
        int overflow_check = ival;
        if (('0' <= *p) && (*p <= '9')) {
            ival = ival * 10 + (int)(*p - '0');
            if (dot > 0) ++dot;
        } else if (*p == '.') {
            if (dot > 0) { return DOUBLE_DOT; }
            dot = 1;
        } else { return PARSE_ERROR; }
        if (overflow_check > ival) { return INTEGER_OVERFLOW; }
    }
    *x = ival;
    if (dot == 0) *x *= 100.0;
    else if (dot == 1) *x *= 100.0;
    else if (dot == 2) *x *= 10.0;
    else if (dot > 3) { return TOO_MANY_DIGITS_AFTER_DECIMAL_POINT; }
    *x /= 100.0;
    return SUCCESS;
}

请参阅gist了解有效的测试代码。

答案 2 :(得分:1)

UPDATE#2在字符数组外写入。 - &GT; UB

假设sizeof(int)== 48

// buf1[14] or buf1[26]
char buf1[sizeof(int)*3+2]="";

// the string length of buf1 is at least 8 and likely 10+
snprintf(buf1, sizeof buf1, "%f", balance1);

char sbal[20]="";
strcat(sbal,"STB Balance: ");  // 14 char used

// attempts to write at least 14+8 = 22 char, sbal too small.  
strcat(sbal,buf1);

也许OP想要

#include <float.h>
//                     -    Digits in FLT_MAX     .xx      \0
#define FLT_SIZE_2_DP (1 + (FLT_MAX_10_EXP + 1) + (1 + 2) + 1 

char sbal[sizeof("STB Balance: ") + FLT_SIZE_2_DP];
int len = snprintf(sbal, sizeof sbal, "STB Balance: %.2f", balance1);
if (len >= 0 && len < sizeof sbal) {
  prn_write_text(sbal,strlen(sbal),1);       
else {
  prn_write_text("Error",5,1);       
}
  

将包含负小数的字符数组转换为只包含2位小数的浮点值的正确方法是什么?

当代码具有特殊输入要求时,有助于创建帮助函数以满足需要。下面读取2个整数,然后将它们组合成float

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

// EOF: end-of-file or IO error
// 0: no conversion
// 1: success
int read_float_2dp(FILE *istream, float *f) {
  intmax_t ipart;
  char fpart_str[3];
  int count = fscanf(istream, "%jd.%2[0-9]", &ipart, fpart_str);
  if (count <= 0) return count;
  int fpart = (count == 2) ? atoi(fpart_str) : 0;
  if (ipart < 0) fpart = -fpart;
  *f = ipart + fpart / 100.0f;
  return 1;
}

答案 3 :(得分:0)



    char pkgamount[10],pkgamount1[10];
    char something[][3] = {"1.3","53","123","569"};
    int amt2;
    float amt1;
    sscanf(pkgamount,"%2d",&amt2);
    sscanf(pkgamount1,"%2.2f",&am1);


%2d只会扫描到十进制值,与小数点前的浮点数2和后面的2相同...现在问题是我不确切知道你期待什么,这就是我定义的东西[] [ 3] 2D数组,导致yu如何存储值,这意味着什么[0] [3]某事[1] [3]某事[2] [3]等等,在内存意味着数组内容0到位持有3个字符,在地方1可以容纳3个......现在它的yto yu如何使用循环来获取值...我可以给你一个例子..



    char something[10][3];
    int i;
    for (1..10)
    {
        scanf("%2s",&something[i]);
    }
    printf("\nSomething array");
    for (i..10)
    {
        printf("\n%2s",something[i]);
    }