Coldfusion 如何计算GPA(平均成绩点)上限

Coldfusion 如何计算GPA(平均成绩点)上限,coldfusion,coldfusion-2018,Coldfusion,Coldfusion 2018,我正在编写一段ColdFusion代码来计算平均分数。如何将GPA的格式(四舍五入)设置为小数点后一位 我尝试使用numberFormat,但没有得到预期的结果。GPA被四舍五入到最接近的整数。例如,当“我有GPA 3.23时,函数将把它四舍五入到3.0,而不是3.2 <cfdump var = "#numberFormat(totalgpa, '.0')#"> 前 当我有GPA 3.23时,预期结果应该是3.2 当我的GPA为3.45时,预期结果应为3.5 当我有GPA 3.

我正在编写一段ColdFusion代码来计算平均分数。如何将GPA的格式(四舍五入)设置为小数点后一位

我尝试使用numberFormat,但没有得到预期的结果。GPA被四舍五入到最接近的整数。例如,当“我有GPA 3.23时,函数将把它四舍五入到3.0,而不是3.2

<cfdump var = "#numberFormat(totalgpa, '.0')#">

当我有GPA 3.23时,预期结果应该是3.2

当我的GPA为3.45时,预期结果应为3.5


当我有GPA 3.98时,预期结果应该是4.0;

当涉及舍入和数字精度时,我不再相信CF。以下是“Java方式”:


#圆形刻度(3.23,1)#=3.2
#圆形刻度(3.45,1)#=3.5
#圆形刻度(3.98,1)#=4.0

ColdFusion的哪个版本?这似乎在CF10-2018和Lucee上正常工作。
numberFormat(3.98,.0')
=
4.0
您的流程中还有哪些代码可能会产生干扰?这是ColdFusion2018@dkgcb相同的错误结果?请分享您正在使用的代码。它与我在上面发布的CFFIDLE不同吗?我同意Alex的观点。CF主要用于双精度(不太精确)并且经常对数字有创造性的解释;-)当精度很重要时,最好使用BigDecimal。哈哈!我终于发现@Ageax和我不同步的东西。我认为这可能对于小数点后一位来说太过分了。精度错误的原因是由于潜在的浮点转换,但这不是真的在你使用小数点后几位之前,请不要犹豫。说真的!;-)虽然这可能有点过分,但知道CF对数字和日期的自由解释——我很犹豫是否要依靠它的黑匣子函数来产生一致的结果——在所有情况下。尤其是在没有任何nu示例的情况下涉及的MBER和数据类型。因为真实值完全有可能显示这里涉及的边缘案例产生了CF的一个“奇怪”结果。更不用说,依赖“只能工作”的代码“在条件下,X以错误的方式摩擦我;-)…;-)除非它会导致严重的性能问题,否则我倾向于使用BigDecimal,因为它不那么脆弱,而且更健壮。@Ageax它更健壮,但在本例中,我们只讨论两位小数。这几乎是任何编号系统都能做到的。我的猜测是OP可能在做一些奇怪的数学运算,这会产生一个巨大的十进制数(或重复的十进制数),这会产生一个巨大的浮点数,它会像预期的那样进行取整,但可能会产生意想不到的结果。OP说他们已经做了测试,但我还是想看看输入的数字。将格式设置为小数点后1位可能会对正确的数字产生任何问题。
<cfoutput>
    #roundWithScale(3.23, 1)# = 3.2<br>
    #roundWithScale(3.45, 1)# = 3.5<br>
    #roundWithScale(3.98, 1)# = 4.0<br>
</cfoutput>

<cffunction name="roundWithScale" access="public" output="false" returnType="numeric">

    <cfargument name="value"    type="numeric"  required="true">
    <cfargument name="scale"    type="numeric"  default="2">
    <cfargument name="rounding" type="string"   default="ROUND_HALF_UP">

    <cfset LOCAL.BigDecimal = createObject("java", "java.math.BigDecimal")>

    <cfset LOCAL.value = createObject("java", "java.math.BigDecimal").init(
        toString(ARGUMENTS.value)
    )>

    <cfreturn LOCAL.value.setScale(
        javaCast("int", ARGUMENTS.scale),
        LOCAL.BigDecimal[ARGUMENTS.rounding]
    )>
</cffunction>