当前位置: 首页 > 知识库问答 >
问题:

双值时的string.format()会给出不准确的结果

柳和怡
2023-03-14

我有这个代码

<tbody>
    @foreach (var day in user.WorkDays)
    {
        <tr>
            <th>@day.Date.ToString("MM/dd/yy")</th>
            <td>
                <ul>
                    @foreach (var note in day.Notes)
                    {
                        <li>@note.Text</li>
                    }
                </ul>
            </td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Regular * 100) / 100)</td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Overtime * 100) / 100)</td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Doubletime * 100) / 100)</td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Sick * 100) / 100)</td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Vacation * 100) / 100)</td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Holiday * 100) / 100)</td>
            <td>@string.Format("{0:0.00}", Math.Truncate(day.Totals.Overall * 100) / 100)</td>
        </tr>
    }
</tbody>
<tfoot>
    <tr>
        <th>Totals:</th>
        <th></th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Regular * 100) / 100)</th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Overtime * 100) / 100)</th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Doubletime * 100) / 100)</th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Sick * 100) / 100)</th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Vacation * 100) / 100)</th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Holiday * 100) / 100)</th>
        <th>@string.Format("{0:0.00}", Math.Truncate(user.Totals.Overall * 100) / 100)</th>
    </tr>
</tfoot>

它产生这样的结果:

(在新选项卡中打开图像以查看完整尺寸。)

<tbody>
    @foreach (var day in user.WorkDays)
    {
        <tr>
            <th>@day.Date.ToString("MM/dd/yy")</th>
            <td>
                <ul>
                    @foreach (var note in day.Notes)
                    {
                        <li>@note.Text</li>
                    }
                </ul>
            </td>
            <td>@day.Totals.Regular.ToString("0.00")</td>
            <td>@day.Totals.Overtime.ToString("0.00")</td>
            <td>@day.Totals.Doubletime.ToString("0.00")</td>
            <td>@day.Totals.Sick.ToString("0.00")</td>
            <td>@day.Totals.Vacation.ToString("0.00")</td>
            <td>@day.Totals.Holiday.ToString("0.00")</td>
            <td>@day.Totals.Overall.ToString("0.00")</td>
        </tr>
    }
</tbody>
<tfoot>
    <tr>
        <th>Totals:</th>
        <th></th>
        <th>@user.Totals.Regular.ToString("0.00")</th>
        <th>@user.Totals.Overtime.ToString("0.00")</th>
        <th>@user.Totals.Doubletime.ToString("0.00")</th>
        <th>@user.Totals.Sick.ToString("0.00")</th>
        <th>@user.Totals.Vacation.ToString("0.00")</th>
        <th>@user.Totals.Holiday.ToString("0.00")</th>
        <th>@user.Totals.Overall.ToString("0.00")</th>
    </tr>
</tfoot>

现在,这些值加起来甚至为80。即使这个值.02也比实际值高。

共有1个答案

汤飞翮
2023-03-14

所以真正的问题是--“总计”应该是原始数字的总和还是截断数字的总和。(顺便说一句,round可以减少错误,但不能消除它。)。如果总数应该是原始数字的总和,那么您可以:

  1. 不要使用报告,并在脚注中解释由于四舍五入,总数可能不完全匹配。
  2. 为“舍入错误”添加一行。
  3. 将舍入误差分配给一个或多个项(这里有一个关于如何做到这一点的问题和参数)

如果总数应该是四舍五入的数字的总数,那么在报告中很容易做到这一点,但它将与原始数字的总数不匹配(除非您在源中四舍五入原始数字)。

 类似资料:
  • 我尝试像这样查询api: http://api.openweathermap.org/data/2.5/weather?q=kuwait 但是,它给了我与国家“PE”相关的结果。我下载了网站上引用的国家代码json文件,并用“科威特”这个词搜索了所有城市,只有1个城市是:“科威特城”,一个是“科威特”。为什么API在搜索“科威特”时会返回国家“PE”? 我也用了

  • 给出两个线性回归会给出不准确预测的例子。解释你的理由。以Python为例编写代码将不胜感激。

  • 问题内容: 因此,当我在Java中使用Doubles进行加法或减法时,它会给我带来奇怪的结果。这里有一些: 如果我加上,它给了我。没错 如果我添加,它会给我(重复s 的数量可能会关闭)。错了 如果我减去,它就会给我(再次,重复的s可能会关闭)。错了 起初我以为这只是将双精度数与十进制值相加的问题,但我错了。以下工作正常: 现在,添加的第一个数字是保存为变量的双精度数,尽管第二个变量从捕获文本。例如

  • 问题内容: 情况一: 输出: 2005年7月8日星期五00:00:00 GMT-0700(PST) 案例二: 输出: Thu Jul 07 2005 17:00:00 GMT-0700(PST) 为什么第二次解析不正确? 问题答案: 在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要

  • 本文向大家介绍准确说出'1,2,3,4'.split()的结果是什么(包括类型和值)?相关面试题,主要包含被问及准确说出'1,2,3,4'.split()的结果是什么(包括类型和值)?时的应答技巧和注意事项,需要的朋友参考一下 上面的同学说的第二个参数的含义有一点错误 运行结果为 ,是一个长度为1的Array,元素类型为String。 关于函数,其可以接受两个参数,第一个参数是字符串或正则表达式,