diff --git a/include/sensorutils.hpp b/include/sensorutils.hpp
index a2f867a..ef764a6 100644
--- a/include/sensorutils.hpp
+++ b/include/sensorutils.hpp
@@ -24,7 +24,7 @@
 namespace ipmi
 {
 static constexpr int16_t maxInt10 = 0x1FF;
-static constexpr int16_t minInt10 = -(0x200);
+static constexpr int16_t minInt10 = -0x200;
 static constexpr int8_t maxInt4 = 7;
 static constexpr int8_t minInt4 = -8;
 
@@ -37,20 +37,14 @@
     // check for 0, assume always positive
     double mDouble;
     double bDouble;
-    if (!(max > min))
+    if (max <= min)
     {
         phosphor::logging::log<phosphor::logging::level::DEBUG>(
             "getSensorAttributes: Max must be greater than min");
         return false;
     }
-    else
-    {
-        mDouble = (max - min) / 0xFF;
-    }
-    if (!mDouble)
-    {
-        mDouble = 1;
-    }
+
+    mDouble = (max - min) / 0xFF;
 
     if (min < 0)
     {
@@ -68,7 +62,7 @@
     // M too big for 10 bit variable
     while (mDouble > maxInt10)
     {
-        if (rExp == maxInt4)
+        if (rExp >= maxInt4)
         {
             phosphor::logging::log<phosphor::logging::level::DEBUG>(
                 "rExp Too big, Max and Min range too far",
@@ -76,13 +70,13 @@
             return false;
         }
         mDouble /= 10;
-        rExp += 1;
+        rExp++;
     }
 
     // M too small, loop until we lose less than 1 eight bit count of precision
     while (((mDouble - floor(mDouble)) / mDouble) > (1.0 / 255))
     {
-        if (rExp == minInt4)
+        if (rExp <= minInt4)
         {
             phosphor::logging::log<phosphor::logging::level::DEBUG>(
                 "rExp Too Small, Max and Min range too close");
@@ -107,7 +101,7 @@
             break;
         }
         mDouble *= 10;
-        rExp -= 1;
+        rExp--;
     }
 
     bDouble /= std::pow(10, rExp);
@@ -116,20 +110,20 @@
     // B too big for 10 bit variable
     while (bDouble > maxInt10 || bDouble < minInt10)
     {
-        if (bExp == maxInt4)
+        if (bExp >= maxInt4)
         {
             phosphor::logging::log<phosphor::logging::level::DEBUG>(
                 "bExp Too Big, Max and Min range need to be adjusted");
             return false;
         }
         bDouble /= 10;
-        bExp += 1;
+        bExp++;
     }
 
     while (((fabs(bDouble) - floor(fabs(bDouble))) / fabs(bDouble)) >
            (1.0 / 255))
     {
-        if (bExp == minInt4)
+        if (bExp <= minInt4)
         {
             phosphor::logging::log<phosphor::logging::level::DEBUG>(
                 "bExp Too Small, Max and Min range need to be adjusted");
@@ -139,8 +133,8 @@
         bExp -= 1;
     }
 
-    mValue = static_cast<int16_t>(mDouble + 0.5) & maxInt10;
-    bValue = static_cast<int16_t>(bDouble + 0.5) & maxInt10;
+    mValue = static_cast<int16_t>(mDouble) & maxInt10;
+    bValue = static_cast<int16_t>(bDouble) & maxInt10;
 
     return true;
 }
@@ -153,6 +147,12 @@
     uint32_t scaledValue =
         (value - (bValue * std::pow(10, bExp) * std::pow(10, rExp))) /
         (mValue * std::pow(10, rExp));
+
+    if (scaledValue > std::numeric_limits<uint8_t>::max() ||
+        scaledValue < std::numeric_limits<uint8_t>::lowest())
+    {
+        throw std::out_of_range("Value out of range");
+    }
     if (bSigned)
     {
         return static_cast<int8_t>(scaledValue);
@@ -176,7 +176,7 @@
     result = getSensorAttributes(max, min, mValue, rExp, bValue, bExp, bSigned);
     if (!result)
     {
-        return 0xFF;
+        throw std::runtime_error("Illegal sensor attributes");
     }
     return scaleIPMIValueFromDouble(value, mValue, rExp, bValue, bExp, bSigned);
 }
diff --git a/tests/test_sensorcommands.cpp b/tests/test_sensorcommands.cpp
index fafe0f7..4e6be85 100644
--- a/tests/test_sensorcommands.cpp
+++ b/tests/test_sensorcommands.cpp
@@ -62,7 +62,7 @@
     if (result)
     {
         EXPECT_EQ(bSigned, false);
-        EXPECT_EQ(mValue, floor(16000.0 / 0xFF + 0.5));
+        EXPECT_EQ(mValue, floor(16000.0 / 0xFF));
         EXPECT_EQ(rExp, 0);
         EXPECT_EQ(bValue, 0);
         EXPECT_EQ(bExp, 0);
@@ -78,7 +78,7 @@
     if (result)
     {
         EXPECT_EQ(bSigned, false);
-        EXPECT_EQ(mValue, floor(0.5 + ((20.0 / 0xFF) / std::pow(10, rExp))));
+        EXPECT_EQ(mValue, floor(((20.0 / 0xFF) / std::pow(10, rExp))));
         EXPECT_EQ(rExp, -3);
         EXPECT_EQ(bValue, 0);
         EXPECT_EQ(bExp, 0);
@@ -100,7 +100,7 @@
     if (result)
     {
         EXPECT_EQ(bSigned, false);
-        EXPECT_EQ(mValue, floor(8000.0 / 0xFF + 0.5));
+        EXPECT_EQ(mValue, floor(8000.0 / 0xFF));
         EXPECT_EQ(rExp, 0);
         EXPECT_EQ(bValue, 80);
         EXPECT_EQ(bExp, 2);
@@ -116,7 +116,7 @@
     if (result)
     {
         EXPECT_EQ(bSigned, true);
-        EXPECT_EQ(mValue, floor(0.5 + ((20.0 / 0xFF) / std::pow(10, rExp))));
+        EXPECT_EQ(mValue, floor(((20.0 / 0xFF) / std::pow(10, rExp))));
         EXPECT_EQ(rExp, -3);
         EXPECT_EQ(bValue, 0);
         EXPECT_EQ(bExp, 0);
